当发生硬件或软件异常时,处理器会在发生异常时停止执行,并将控制权传输到系统。 首先,系统同时保存当前线程的计算机状态和描述异常的信息。 然后,系统会尝试查找异常处理程序来处理异常。
发生异常的线程的计算机状态保存在 CONTEXT 结构中。 此信息(称为 上下文记录)使系统能够在异常成功处理时继续执行异常。 异常的说明(称为 异常记录)保存在 EXCEPTION_RECORD 结构中。 因为它将上下文记录的计算机相关信息与异常记录的计算机无关的信息分开存储,因此异常处理机制可移植到不同的平台。
上下文和异常记录中的信息都可以通过 GetExceptionInformation 函数获得,并且可用于因异常而执行的任何异常处理程序。 异常记录包括以下信息。
- 标识异常类型的异常代码。
- 指示异常是否可连续的标志。 在不可连续异常后继续执行的任何尝试都生成另一个异常。
- 指向另一个异常记录的指针。 这有助于在发生嵌套异常时创建异常的链接列表。
- 发生异常的地址。
- 一个参数数组,提供有关异常的其他信息。
当用户模式代码中发生异常时,系统使用以下搜索顺序查找异常处理程序:
- 如果正在调试进程,系统将通知调试器。 有关详细信息,请参阅 调试器异常处理。
- 如果未调试进程,或者关联的调试器未处理异常,则系统会尝试通过搜索发生异常的线程的堆栈帧来查找基于帧的异常处理程序。 系统首先搜索当前堆栈帧,然后按反向顺序搜索前面的堆栈帧。
- 如果找不到基于帧的处理程序,或者没有基于帧的处理程序处理异常,但正在调试进程,则系统会再次通知调试器。
- 如果未调试进程,或者关联的调试器未处理异常,则系统会根据异常类型提供默认处理。 对于大多数异常,默认作是调用 ExitProcess 函数。
当在内核模式代码中发生异常时,系统会在尝试查找异常处理程序时搜索内核堆栈的堆栈帧。 如果处理程序无法找到或没有处理程序处理异常,系统会关闭,就像调用了 ExitWindows 函数一样。