Structured Exception Handling
2007-01-14 20:14:46 来源:WEB开发网要是另一种情况,即线程发生了异常却再也没有异常处理程序了怎么办?在这种情况下,控制流流进_except关键字后的大括号里。在BaseProcessStart里,这段代码叫UnhandledExceptionFilterAPI,我在后面还会回来介绍它。现在的关键是UnhandledExceptionFilterAPI包含着默认的异常处理函数。
若UnhandledExceptionFilter返回的是EXCEPTION_EXECUTE_HANDLER,BaseProcessStart的_except块就执行。_except块代码所作的就是调用ExitProcess来结束当前进程。仔细考虑一下,这样做还是有意义的;一个常识就是,如果程序引起了异常又没有处理程序能处理此异常,系统就结束该进程。伪码中所展示的正是这种情况。
还要最后补充一点。如果引发异常的线程是作为服务运行的且是用于一个基于线程的服务,则_except块并不会调用ExitProcess而是调用ExitThread。没有人会因为一个服务出错而结束整个服务进程。
UnhandledExceptionFilter中的默认异常处理程序又作了些什么呢?当我在讨论班上提出这个问题时,没几个人能猜出未处理的异常发生时操作系统的默认行为。通过对默认处理程序行为的演示,答案一点即明,人们就都明白了。我只是运行了一个主动引起异常的程序,并指出其结果(见Figure8)。
Figure8UnhandledExceptionDialog
UnhandledExceptionFilter显示了一个对话框,告诉你发生了一个异常。此时,要么可以结束进程,要么就调试引发异常的进程。在这幕后还有相当多的操作,我在本文结束前再来讲这些东西。正如我所提到的,当异常发生时,用户编写的代码可以得到执行(通常是这样的)。类似地,在unwind操作过程中,用户编写的代码也可以得到执行。用户的代码可能仍有问题并引起另一个异常。因此,异常回调函数还可以返回另外两个值:ExceptionNestedException和ExceptionCollidedUnwind。显然这些内容就很深了,我并不想在这里介绍。其对于理解基本事实来说太难了。
Tags:Structured Exception Handling
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接