vc2010中【启用C++异常】编译条件默认为【是(/EHsc)】,在此选项下,try catch模块只能捕获C++异常(throw语句),而捕获不到结构化异常。若编译条件为【是,但有SEH异常(/EHa)】,则两种异常都可以捕获。通过其它文档得知,try catch也是建立在SEH基础之上,那为什么不能捕获SEH异常呢?这背后又是怎么实现的呢?
大家知道,throw语句最终也会调用RaiseException(错误代码为0E06D7363h),其实try语句建立的异常处理函数是能捕获到SEH异常的,但是异常处理根据所编译在数据段上的信息得知此异常不处理结构化异常,于是返回1,即ExceptionContinueSearch。
以下为不同编译条件下产生的汇编信息
1. 【是(/EHsc)】
__ehfuncinfo$_wmain DD 019930522H
DD 02H
DD FLAT:__unwindtable$_wmain
DD 01H
DD FLAT:__tryblocktable$_wmain
DD 2 DUP(00H)
DD 00H
DD 01H
2. 【是,但有SEH异常(/EHa)】
__ehfuncinfo$_wmain DD 019930522H
DD 02H
DD FLAT:__unwindtable$_wmain
DD 01H
DD FLAT:__tryblocktable$_wmain
DD 2 DUP(00H)
DD 00H
DD 00H