Structured Exception Handling
2007-01-14 20:14:46 来源:WEB开发网Figure6UnwindingfromanException
更一般地说,从异常中的unwinding使得位于处理帧的堆栈区域之下的所有的东西都被移除,几乎相当于从未调用过那些函数。unwinding的另一个效果就是链表中位于处理异常的EXCEPTION_REGISTRATION之前的所有EXCEPTION_REGISTRATIONs都被从链表中移除。这是有意义的,因为这些EXCEPTION_REGISTRATION一般都是在堆栈上构建的。在异常被处理后,堆栈指针和堆栈帧指针在内存中的地址要比从链表中移除的那些EXCEPTION_REGISTRATIONs高。Figure6所示即为所述。
Help!NobodyHandledIt!
到目前为止我都是假设操作系统总能在 EXCEPTION_REGISTRATION链表中找到处理程序。要是没有相应的处理程序怎么办?这种情况几乎不会发生。原因是操作系统私地下为每个线程都准备了一个默认的异常处理程序。这个默认的异常处理程序总是链表的最后一个节点并总被选来处理异常。它的行为与一般的异常回调函数有些不同,我之后会说明。
我们来看一下系统在那里安插这个默认的、最终的异常处理程序。这显然要在线程执行的前期进行,要在任何用户代码执行之前。Figure7为我为BaseProcessStart写的伪码,BaseProcessStart是WindowsNT的KERNEL32.DLL的一个内部函数。BaseProcessStart需要一个参数,即线程入口的地址。BaseProcessStart运行在新进程的上下文中并调用入口点来启动进程第一个线程。
注意在伪码中,对lpfnEntryPoint的调用被封装在了一对_try和_except中。这个_try块就是用来在异常处理链表中安装那个默认的最终异常处理程序的。所有之后注册的异常处理程序都会插在链表中这个处理程序的前面。若lpfnEntryPoint函数返回,线程就运行至完成而不引起异常。若是这样,BaseProcessStart调用ExitThread来结束线程。
Tags:Structured Exception Handling
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接