VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)
Posted 朝闻道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)相关的知识,希望对你有一定的参考价值。
IDE:VC6
今天遇到一个小问题,把我郁闷了好久,××医生的VulEngine不时在wcsstr处发生crash,加了一番强大的参数检查后,再加上了强大的try catch,其实不是很喜欢用try和catch,总觉得一个完美的程序,应该代码的每一处都可以被程序员控制的,我倾向如对函数的返回值和参数进行强制的检查,当然这就要求你自己设计的函数必须也得满足这些要求,不过事情牵扯到读写文件,处理字符串等等繁琐的操作,偶尔用一用try catch是比较简洁的,我在wcsstr前后加上异常处理代码后,debug下very perfect,出现异常(空指针,字符串不可读)时,被捕捉到了,程序不再crash,但是,release下依然会出现崩溃的问题,what,happend?
后来去查了下资料才知道,在release下,如果在try语句块中(包括调用的函数)没有throw语句,则,整个try catch会被编译器给优化掉,不过这是符合C++标准的,因为C++标准说,catch必须能捕获程序中所有通过throw语句抛出的异常;至于内存访问违例,被0除等等系统异常则C++标准并未做要求,不过VC下的扩展_try _catch貌似是可以的,比较强大。现在想来,还真是杯具,以前不知道写过多少try catch但是从未去认真关注个这个问题,也不知道有没有被优化掉而让自己脆弱的代码像裸体一样暴露在挑剔的windows面前。
要解决上面的问题也不难,在编译选项中加入/EHa即可防止编译器优化try语句。
总的来说,C++的异常处理还是比较依赖于不同的编译器和系统的,不是很稳定,移植性也比较差,Java的异常处理又总觉得不灵泛,让人没有选择,反倒是比较喜欢Python的异常处理机制,嘿嘿。
windows平台下的异常处理强大的原因在于系统的SEH(结构化异常)处理机制,其实try catch也是使用SEH的变形封装实现的。最近正在看这方面的资料,有点心得了再写。
- try
- {
- wchar_t* pch;
- pch = (wchar_t*)0x10001022;
- wcsstr(pch, L"abc");
- }
- catch(...)
- {
- printf("Catched a exception/n");
- }
http://blog.csdn.net/magictong/article/details/5504735
以上是关于VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)的主要内容,如果未能解决你的问题,请参考以下文章
在vc6中用opencv写了一个小游戏,debug下可以正常运行,但是release之后,不能运行。
Java try/catch/finally内部执行顺序&外部语句何种情况下执行