vctrycatchthrow用法详解

vctrycatchthrow用法详解

ID:9417082

大小:17.71 KB

页数:4页

时间:2018-04-30

vctrycatchthrow用法详解_第1页
vctrycatchthrow用法详解_第2页
vctrycatchthrow用法详解_第3页
vctrycatchthrow用法详解_第4页
资源描述:

《vctrycatchthrow用法详解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、异常控制try,catch用法小结出处:ChinaUnix.net1、基础介绍try{//程序中抛出异常throwvalue;}catch(valuetypev){//例外处理程序段}语法小结:throw抛出值,catch接受,当然,throw必须在“try语句块”中才有效。2、深入throw:(i)、程序接受到throw语句后就会自动调用析构器,把该域(try后的括号内)对象cleanup,然后再进入catch语句(如果在循环体中就退出循环)。这种机制会引起一些致命的错误,比如,当“类”有指针成员变量时(

2、又是指针!),在“类的构建器”中的throw语句引起的退出,会导致这个指针所指向的对象没有被析构。这里很基础,就不深入了,提示一下,把指针改为类就行了,比如模板类来代替指针,在模板类的内部设置一个析构函数。(ii)、语句“throw;”抛出一个无法被捕获的异常,即使是catch(...)也不能捕捉到,这时进入终止函数,见下catch。3、深入catch:一般的catch出现的形式是:try{}catch(except1&){}catch(except2&){}catch(...){}//接受所有异常一般都写

3、成引用(except1&),原因很简单,效率。问题a:抛出异常,但是catch不到异常怎么办?(注意没有java类似的finally语句)在catch没有捕获到匹配的异常的时候,会调用默认的终止函数。可以调用set_terminate()来设置终止函数,参数是一个函数指针,类型是:void(*terminate)()。到这里,可以题个问题:“没有try-catch,直接在程序中"throw;",会怎么样?”其他一些技巧:4、try一个函数体,形式如下voidfun(type1,type2)try----tr

4、y放在函数体后{  函数定义}catch(typeX){}这个用法的效果就相当于:voidfun(){  try{函数定义}}5、throw一个函数体,形式如下:voidfun();//能抛出任何类型的异常voidfun()throw(except1,except2,except3)                  //后面括号里面是一个异常参数表,本例中只能抛出这3中异常voidfun()throw()  //参数表为空,不能抛出异常问题b:假设fun()中抛出了一个不在“异常参数表”中的异常,会怎么样

5、?答:调用set_terminate()中设定的终止函数。然而,这只是表面现象,实际上是调用默认的unexpected()函数,然而这个默认的unexpected()调用了set_terminate()中设定的终止函数。可以用set_unexpected()来设置unexpected,就像set_terminate()一样的用法,但是在设定了新的“unexpected()”之后,就不会再调用set_terminater中设定的终止函数了。这个语法是很有用的,因为在用别人的代码时,不知道哪个地方会调用什么函数

6、又会抛出什么异常,用一个异常参数表在申明时限制一下,很实用。摘自:http://blog.csdn.net/startexcel/archive/2009/05/19/4201585.aspxvctrycatch捕捉所有异常的问题try{}catch(…){}以前都是用try{}catch(…){}来捕获C++中一些意想不到的异常,今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:try{BYTE*pch;pch=(BYTE*)00001234;  //给予一个非法地址 *

7、pch=6;//对非法地址赋值,会造成AccessViolation异常}catch(...){AfxMessageBox("catched");}这段代码在debug下没有问题,异常会被捕获,会弹出”catched”的消息框。但在Release方式下如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码,如果没有找到throw代码,他就会认为trycatch结构是多余的,给优化掉。这样造成在Release模式下,上述代码中的异常不能被捕获,从而迫使程序弹出错误提示框退出。那么能否在releas

8、e代码优化状态下捕获这个异常呢,答案是有的。就是__try,__except结构,上述代码如果改成如下代码异常即可捕获。__try{BYTE*pch;pch=(BYTE*)00001234;  //给予一个非法地址 *pch=6;//对非法地址赋值,会造成AccessViolation异常}__except(EXCEPTION_EXECUTE_HANDLER){AfxMessageBox("catched");}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。