例外派送

【勇芳软件工作室】汉化HomePreviousNext

当发生硬件或软件异常时,处理器在异常发生的时刻停止执行,并将控制权转移给系统。首先,系统保存当前线程的机器状态和描述异常的信息。然后系统尝试查找异常处理程序来处理异常。

发生异常的线程的机器状态保存在CONTEXT结构中。该信息(称为【上下文记录】)使得如果异常成功处理,系统将在异常时继续执行该操作。异常的描述(称为【例外记录】)保存在EXCEPTION_RECORD结构中。因为它将上下文记录的机器相关信息与异常记录的与机器无关的信息分开存储,所以异常处理机制可移植到不同的平台。上下文和异常记录中的信息都可以通过GetExceptionInformation函数获得,并且可以作为异常执行的任何异常处理程序使用。异常记录包括以下信息。

*一个异常代码,用于标识异常的类型。

*表示异常是否可持续的标志。任何在不可持续异常之后继续执行的尝试都会产生另一个异常。

*指向另一个异常记录的指针。如果嵌套异常发生,这有助于创建异常链接列表。

*发生异常的地址。

*提供有关异常的其他信息的32位参数数组。

当在用户模式代码中发生异常时,系统会经历以下搜索异常处理程序:

系统首先尝试通知进程的调试器(如果有的话)。

2.如果进程没有被调试,或者相关的调试器不处理异常,系统将通过搜索发生异常的线程的堆栈帧来尝试定位基于帧的异常处理程序。系统首先搜索当前的堆栈帧,然后通过前面的栈帧向后进行。

3.如果没有找到基于帧的处理程序,或者没有基于帧的处理程序处理异常,则系统再次尝试通知进程的调试器。

4.如果进程没有被调试,或者相关的调试器不处理异常,系统会根据异常类型提供默认处理。对于大多数异常,默认操作是调用ExitProcess函数。

当内核模式代码发生异常时,系统会搜索内核堆栈的堆栈帧,以尝试查找异常处理程序。如果处理程序无法找到或没有处理程序处理异常,则系统将被关闭,就像调用了ExitWindows函数一样。