首页 > 代码库 > VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)

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的变形封装实现的。最近正在看这方面的资料,有点心得了再写。

 

[cpp] view plain copy
 
  1. try   
  2. {  
  3.     wchar_t* pch;  
  4.     pch = (wchar_t*)0x10001022;  
  5.     wcsstr(pch, L"abc");  
  6. }  
  7. catch(...)   
  8. {   
  9.     printf("Catched a exception/n");   
  10. }   

 

http://blog.csdn.net/magictong/article/details/5504735

VC6下 try catch 在release下的杯具(默认情况下,要加上throw语句catch才不会被优化掉)