try{} catch(…){} Exception handling options. /EHa vs /EHsc
来源:互联网 发布:js给li增加class属性 编辑:程序博客网 时间:2024/05/22 16:05
以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:
- try
- {
- BYTE* pch ;
- pch = ( BYTE* )00001234 ; //给予一个非法地址
- *pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
- }
- catch(...)
- {
- AfxMessageBox( "catched" ) ;
- }
这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。 但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
那么能否在release代码优化状态下捕获这个异常呢, 答案是有的。 就是__try, __except结构, 上述代码如果改成如下代码异常即可捕获。
- __try
- {
- BYTE* pch ;
- pch = ( BYTE* )00001234 ; //给予一个非法地址
- *pch = 6 ; //对非法地址赋值,会造成Access Violation 异常
- }
- __except( EXCEPTION_EXECUTE_HANDLER )
- {
- AfxMessageBox( "catched" ) ;
- }
但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?
当然有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。
/EHa means "Do the right thing, no matter what happens". /EHsc means "Take every shortcut you can find". There's a notable cost associated to exception handling, notably in 32-bit mode because of the cost of setting up the SEH chain. /EHsc is there to let you to tell the compiler "do the best you can".
http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/80d7ae59-141c-4993-bd1f-6bcb72be000b
- try{} catch(…){} Exception handling options. /EHa vs /EHsc
- [转载] Basic try-catch-finally Exception Handling in Java
- 异常捕获--编译开关EHsc、EHa
- c++ try catch exception
- try catch throws Exception
- Exception Basics - Try Catch Finally
- 关于try{} catch(exception e )
- JavaScript的Exception处理(try...catch...finally)
- Error Handler/Exception Clause/Try ... Catch ... Finally
- Java Exception 之 try catch finally
- try{}catch(Exception e){}与spring事务
- python catch exception and continue try block
- exception(异常处理)与try,catch,
- how to improve try catch exception handler
- java基础之异常Exception---try...catch
- Exception的try{}catch{}处理(return)
- throw exception和 try catch的区别
- try{}catch(Exception e){}异常处理
- rewind函数
- 一个人的命运决定于晚上8点到10点之间
- javascript try{}catch(err){} 对象 成员。 方法
- FindFirstFile和FindNextFile的使用
- C# 浮点数运算问题
- try{} catch(…){} Exception handling options. /EHa vs /EHsc
- 这段时间的Java学习
- 开源四项基本原则,阐释MeeGo的真正开源性
- Flex4 AdvancedDataGrid 控件的介绍和使用
- 音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw
- 如何克服心理恐惧--转
- windows 7 内核程序开发经验总结
- 一个简单项目的构思
- Android Intent的几种用法全面总结