第25章 未处理异常、向量化异常与C++异常
本章纯粹是为了走过场,深入了解看书吧。
一、未处理异常:
1、如何出现:若异常过滤程序返回EXCEPTION_CONTINUE_SEARCH,系统继续在调用树的上层寻找异常过滤程序。若每个异常过滤程序都返回EXCEPTION_CONTINUE_SEARCH,就会遇到所谓的未处理异常。
2、解决方法:Windows函数SetUnhandledExceptionFilter给我们处理异常的最后机会,否则Windows就正式认为这个异常没有得到处理。应在进程初始化阶段调用这个函数。
PTOP_LEVEL_EXCEPTION_FILTERSetUnhandledExceptionFilter(
PTOP_LEVEL_EXCEPTION_FILTERpTopLevelExceptionFilter);
异常过滤函数原型必须与下相似:
LONG WINAPITopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo);
注意:若以NULL为参数调用SetUnhandledExceptionFilter,则将由UnhandledExceptionFilter来处理全局未处理异常(当使用C/C++运行库时,在进程入口点函数执行前,C/C++运行库会安装一个默认的全局异常过滤程序:_CxxUnhandledExceptionFilter,此函数工作原理:首先检查异常是不是属于C++异常。若是,则结束时执行abort函数,后者将调用Kernel32.dll中的UnhandledExceptionFilter函数。若否,则返回EXCEPTION_CONTINUE_SEARCH,来让Windows来处理这个异常。
);若否,则由自动以的函数来处理全局未处理异常。
二、向量化异常
SHE是一种基于代码框的机制。Windows提供了向量化异常处理机制。程序可注册一个函数,而不需要依赖于语言有关的关键字。每当异常发生或一个未处理异常脱离标准SHE控制时,此函数就会被调用。
三、C++异常与结构化异常的比较
SHE是OS提供的便利,可在任何语言中使用。而C++异常处理仅在编写C++代码时才可使用。若开发C++程序,就用C++异常。因C++异常是语言的一部分,编译器知道什么是一个C++对象,也就意味着编译器会自动调用生成代码来调用C++对象的析构函数,保证对象的释放。
Visual C++编译器用OS的结构化异常来实现C++异常处理机制。对比如下:
C++ | try | catch | throw |
SEH | __try | __except | RaiseException |