c++ try catch 问题

发布于:2021-12-03 12:44:42

try{} catch(…){}

以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:



  1. 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结构, 上述代码如果改成如下代码异常即可捕获。



  1. __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模块给优化掉了。


找到一篇比较好的英文文章谈这个问题: http://members.cox.net/doug_web/eh.htm


用C++10 年多了 , 居然这么基础的问题都搞错, 真是汗颜。 要加紧学*啊, Stay Hungry, Stay Foolish!


Written by oldmonk on 九月 11th, 2006 with 2 comments.


C++中catch(…)如何使用

感性认识

int main()

  2、哈哈!int类型的异常被catch(…)抓获了,再来另一个例子:


int main()

   3、同样,double类型的异常对象也被catch(…)块抓获了。是的,catch(..)能匹配成功所有的数据类型的异常对象,包括C++语言提 供所有的原生数据类型的异常对象,如int、double,还有char*、int*这样的指针类型,另外还有数组类型的异常对象。同时也包括所有自定义 的抽象数据类型。例程如下:


int main()



  4、对于抽象数据类型的异常对象。catch(…)同样有效,例程如下:


class MyException

int main()

try

  请问上面的程序运行时会出现什么结果吗?catch(…)能抓获住系统中出现的access violation exception异常吗?朋友们!和我们的主人公阿愚一样,自己动手去测试一把!

为什么要用catch(…)这个东东?

void Func()

BOOL CXXXApp::InitInstance()

AfxEnableControlContainer();


// Standard initialization

#ifdef _AFXDLL



// Since the dialog has been closed, return FALSE so that we exit the

   通过上面的例程和分析可以得出,由于catch(…)能够捕获所有数据类型的异常对象,所以在恰当的地方使用catch(…)确实可以使软件系统有着更 好的可靠性。这确实是大家使用catch(…)这个东东最好的理由。但不要误会的是,在C++异常处理模型中,不只有catch(…)方法能够捕获几乎所 有类型的异常对象(也许有其它更好的方法,在下一篇文章中主人公阿愚带大家一同去探讨一下),可C++标准中为什么会想到定义这样一个catch(…) 呢?有过java或C#编程开发经验的程序员会发现,在它们的异常处理模型中,并没有这样类似的一种语法,可这里不得不再次强调的是,java中的异常处 理模型是C++中的异常处理模型的完善改进版,可它反而没有了catch(…),为何呢?还是先去看看下一章吧,“C++的异常处理和面向对象的紧密关系 ”。也许大家能找到一个似乎合理的原因。


?


?


转自?? http://hi.baidu.com/swdraven/blog/item/e50ee5268e49a21e8b82a103.html

相关推荐

最新更新

猜你喜欢