结构化异常(structured exception) vs C++异常(C++ exception)
大家都知道C++异常是C++语言的一个特性,用户可以使用throw的方式来抛出异常,try{} catch(...){}来捕获异常。结构化异常是诸如,Zero Divided, Access violations等异常,这些异常是由系统支持的,并非语言特性。在C语言或者汇编也可以截获这类异常。
struct EXCEPTION_REGISTRATION
{
EXCEPTION_REGISTRATION *prev;
DWORD handler;
};
mov FS:[0], exc_regp
通过向FS寄存器注册异常处理回调函数来实现。在C++里面可以使用
__try {
}
__except(EXCEPTION_EXECUTE_HANDLER) {
}
来截获,编译器会自动生成相应的汇编代码。
同步异常 vs 异步异常
这个属于C++编译器的选项,在VS2008里面对应的是EHs(异步异常)和EHa(同步异常),在同步异常的情况下try{} catch(...){}会截获C++异常和结构化异常,用户就不需要另外写__try{}__exception{}这样的冗余代码了。但是如果是异步异常的时候,就只能截获C++异常。VS2008在编译debug版本的时候使用同步异常,使用release编译的时候是异步异常。异步异常有一个重要的优化,就是如果检查到try里面的所有语句都没有调用throw,那么catch部分的代码将被优化掉!
所以在捕获异常的时候要小心哦,必须清楚明白自己想要捕获什么样的异常,以决定使用什么样的方式。
下面是一个使用例子:
参考文章:
http://msdn.microsoft.com/en-us/library/1deeycx5(VS.80).aspx
http://www.codeproject.com/KB/cpp/exceptionhandler.aspx