EXCEPTION_RECORD 结构 (winnt.h)

描述异常。

语法

typedef struct _EXCEPTION_RECORD {
  DWORD                    ExceptionCode;
  DWORD                    ExceptionFlags;
  struct _EXCEPTION_RECORD *ExceptionRecord;
  PVOID                    ExceptionAddress;
  DWORD                    NumberParameters;
  ULONG_PTR                ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;

成员

ExceptionCode

发生异常的原因。 这是硬件异常生成的代码,或在 RaiseException 函数中为软件生成的异常指定的代码。 下表描述了由于常见编程错误而可能发生的异常代码。

含义
EXCEPTION_ACCESS_VIOLATION
线程尝试从虚拟地址读取或写入其没有相应访问权限的虚拟地址。
EXCEPTION_ARRAY_BOUNDS_EXCEEDED
线程尝试访问超出边界且基础硬件支持边界检查的数组元素。
EXCEPTION_BREAKPOINT
遇到断点。
EXCEPTION_DATATYPE_MISALIGNMENT
线程尝试读取或写入在不提供对齐的硬件上未对齐的数据。 例如,16 位值必须在 2 字节边界上对齐;4 字节边界上的 32 位值等。
EXCEPTION_FLT_DENORMAL_OPERAND
浮点运算中的一个操作数是反常运算。 非规范值太小,无法表示为标准浮点值。
EXCEPTION_FLT_DIVIDE_BY_ZERO
线程尝试将浮点值除以 0 的浮点除数。
EXCEPTION_FLT_INEXACT_RESULT
浮点运算的结果不能完全表示为小数点。
EXCEPTION_FLT_INVALID_OPERATION
此异常表示此列表中未包含的任何浮点异常。
EXCEPTION_FLT_OVERFLOW
浮点运算的指数大于相应类型允许的量级。
EXCEPTION_FLT_STACK_CHECK
堆栈因浮点运算而溢出或下溢。
EXCEPTION_FLT_UNDERFLOW
浮点运算的指数小于相应类型允许的量级。
EXCEPTION_ILLEGAL_INSTRUCTION
线程尝试执行无效指令。
EXCEPTION_IN_PAGE_ERROR
线程尝试访问不存在的页面,但系统无法加载该页。 例如,如果在通过网络运行程序时网络连接断开,则可能会发生此异常。
EXCEPTION_INT_DIVIDE_BY_ZERO
线程尝试将整数值除以零的整数除数。
EXCEPTION_INT_OVERFLOW
整数运算的结果导致执行结果中最重要的位。
EXCEPTION_INVALID_DISPOSITION
异常处理程序向异常调度程序返回了无效处置。 使用高级语言(如 C)的程序员不应遇到此异常。
EXCEPTION_NONCONTINUABLE_EXCEPTION
线程尝试在发生不可连续的异常后继续执行。
EXCEPTION_PRIV_INSTRUCTION
线程尝试执行在当前计算机模式下不允许其操作的指令。
EXCEPTION_SINGLE_STEP
跟踪陷阱或其他单指令机制指示已执行一个指令。
EXCEPTION_STACK_OVERFLOW
线程占用了其堆栈。
 

调试控制台进程时,可能会发生另一个异常代码。 它不会因为编程错误而出现。 当将 CTRL+C 输入到处理 CTRL+C 信号的控制台进程并正在调试时,会发生DBG_CONTROL_C异常代码。 此异常代码不应由应用程序处理。 它仅出于调试器的优势而引发,并且仅在将调试器附加到控制台进程时引发。

ExceptionFlags

此成员包含零个或多个异常标志。 下表描述了一些常见的异常标志。 下表中不存在的异常标志应被视为保留以供系统使用。

异常标志 含义
EXCEPTION_NONCONTINUABLE
存在此标志表示异常是不可持续的异常,而缺少此标志则表示该异常是一个连续的异常。 在不可持续异常后继续执行的任何尝试都会导致 EXCEPTION_NONCONTINUABLE_EXCEPTION 异常。
EXCEPTION_SOFTWARE_ORIGINATE
此标志保留供系统使用。

ExceptionRecord

指向关联的 EXCEPTION_RECORD 结构的指针。 异常记录可以链接在一起,以在发生嵌套异常时提供其他信息。

ExceptionAddress

发生异常的地址。

NumberParameters

与异常关联的参数数。 这是 ExceptionInformation 数组中定义的元素数。

ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]

描述异常的其他参数的数组。 RaiseException 函数可以指定此参数数组。 对于大多数异常代码,数组元素是未定义的。 下表描述了定义了数组元素的异常代码。

异常代码 含义
EXCEPTION_ACCESS_VIOLATION
数组的第一个元素包含一个读写标志,该标志指示导致访问冲突的操作类型。 如果此值为零,则线程尝试读取不可访问的数据。 如果此值为 1,则线程尝试写入不可访问的地址。

如果此值为 8,则线程导致用户模式数据执行防护 (DEP) 冲突。

第二个数组元素指定不可访问数据的虚拟地址。

EXCEPTION_IN_PAGE_ERROR
数组的第一个元素包含一个读写标志,该标志指示导致访问冲突的操作类型。 如果此值为零,则线程尝试读取不可访问的数据。 如果此值为 1,则线程尝试写入不可访问的地址。

如果此值为 8,则线程导致用户模式数据执行防护 (DEP) 冲突。

第二个数组元素指定不可访问数据的虚拟地址。

第三个数组元素指定导致异常的基础 NTSTATUS 代码。

注解

若要使调试器能够调试在 32 位 (与 64 位) 的不同体系结构上运行的目标,请使用此结构的显式形式之一。

typedef struct _EXCEPTION_RECORD32 {
    DWORD    ExceptionCode;
    DWORD ExceptionFlags;
    DWORD ExceptionRecord;
    DWORD ExceptionAddress;
    DWORD NumberParameters;
    DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;

typedef struct _EXCEPTION_RECORD64 {
    DWORD    ExceptionCode;
    DWORD ExceptionFlags;
    DWORD64 ExceptionRecord;
    DWORD64 ExceptionAddress;
    DWORD NumberParameters;
    DWORD __unusedAlignment;
    DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;

要求

   
最低受支持的客户端 Windows XP [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 |UWP 应用]
标头 winnt.h (包括 Windows.h)

另请参阅

EXCEPTION_DEBUG_INFO

EXCEPTION_POINTERS

GetExceptionInformation

RaiseException

UnhandledExceptionFilter