Welcome to A!Die Software Studio |
对windows平台几种异常处理的简单介绍,权当抛砖引玉了。
1. UEF(UnhandledExceptionFilter): 通过SetUnhandledExceptionFilter,不需要在各个代码处分别处理,可以为整个应用程序安装统一的异常处理程序,代码的实现简单集中。缺点是windows只负责维护一个全局函数指针,后面的SetUnhandledExceptionFilter调用会覆盖前面的,今天的应用程序有很多都使用了这个函数,有可能导致你的代码不能被调用。并且它的优先级最低,如果有VEH或者SEH处理了异常,UEF会什么都不知道。
2. SEH,通过这种方式,每个函数都可以安装自己的异常处理器,优先级高于UnhandledExceptionFilter,由于SEH是编译器基于栈桢辅助实现的,象call stack一样,SEH会层层嵌套,内层函数的SEH会先于外层的SEH被系统调用。这个看上去很美,但遗憾的是,你并不总是想这样。举个例子,如果你有多个线程,即使所有的异常处理过程都一样,你也不得不在每个线程里写同样的代码来实现SEH。
3. VEH,有点类似1,在进程中提供一个统一的地方处理异常。但优先级高于SEH。缺点是XP及以后的OS才能使用这个功能。另外,windows使用链表记录所有注册的VEH,如果你的代码中使用的第三方代码也调用了VEH,仍然无法保证你注册的VEH会被调用。不过这个缺点应该被无视了,因为上述的方法都有类似的问题。既然大家都有同样的问题,那就是没有问题了。
异常发生时Windows按3,2,1的顺序调用它们。在你的应用里需要什么样的异常处理呢?