正文

第5集 C++的异常rethrow 2006-01-19 16:57:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/mroske/9743.html

分享到:

  上一篇文章已经提到了C++的异常rethrow现象,这篇文章将进一步深入讨论这个问题。当catch到一个异常后进入异常处理程序块中,此时需要从传入的异常对象中得到一些关于异常的详细信息,并判断这个异常是否能得以恢复,是否能在当前的异常处理程序块中得以处理。如果是,那么及时地处理掉这个异常,使程序恢复到正常的工作轨道上(也即从catch block后面的代码处继续执行);否则就必须重新抛出异常(Excption Rethrow),把这个异常交给上一层函数的异常处理模块去处理(反正我是处理不了了,而且我也通知了我的上层领导,所以责任吗,也就不由我担当了,哈哈 ^-^)。 语法  很简单,有两种用法,如下:  1、 throw ;  2、 throw exception_obj ;  第一种表示原来的异常对象再次被重新抛出;第二中呢,则表示原来的异常已处理或正在处理中,但此时又引发了另一个异常。示例如下: void main(){try{try{throw 4;}catch(int value){// 第一种用法,原来的异常被再次抛出// 注意它不需要带参数。throw;} try{throw 0.5;}catch(double value){// 第二种用法,再次抛出另外的一个异常// 它的语法和其它正常抛出异常的语法一样。throw “another exception”;}}catch(...){cout << “unknow exception”<< endl;}}在什么地方异常可以rethrow?  当然,异常的rethrow只能在catch block中,或者说在catch block中抛出的异常才是异常的rethrow,因此注意下面的示例程序中存在语法错误,如下:void main(){try{try{throw 4;}catch(int value){// 这里的语法是对的。throw;} // 但这里的语法却是不对的。// 不能在这里进行异常的rethrowthrow;}catch(...){cout << “unknow exception”<< endl;}} 异常rethrow需要注意的问题!异常rethrow需要注意什么问题呢?看例子先! void main(){try{try{throw 4;}catch(int value){// 异常的rethrowthrow;}catch(...){cout << “能打印我这条消息吗?”<< endl;} }catch(...){cout << “unknow exception”<< endl;}}  上面的程序运行结果是:“unknow exception”  由此我们可以得出结论,异常的rethrow后,它会在它上一层的trycatch块开始查找匹配的catch block异常处理块,而在同一层中,如果当前的catch block后面还有其它的catch block,它是不会去匹配的。所以程序中一般层次模型的trycatch要比线性结构的trycatch要好一些,如下(示例2要比示例1好): // 示例1void main(){try{}catch(DataType1&){}catch(DataType2&){}catch(DataType3&){}catch(...){} } // 示例2void main(){try{try{try{try{}catch(DataType1&){}}catch(DataType2&){}}catch(DataType3&){}}catch(...){}} 总结  相遇篇的文章到此结束。通过这几篇文章的介绍,目前已经对异常处理编程的思想,C++异常处理模型、语法,以及C++异常处理与面向对象的关系等等,都有了一个大概性的了解。主人公阿愚根据自己的理解和经验,现在对相遇篇中的知识再做出如下一些总结:  (1) 异常处理编程和面向对象,是现在程序设计和编程中最不可缺少的两个好东东;  (2) C++异常处理模型是层次型的,能很好地支持嵌套;  (3) C++异常处理编程提供try、catch和throw三个关键字。其中try定义受监控的程序块;catch定义异常处理模块;throw让程序员可以在程序执行出错的地方抛出异常;  (4) C++异常处理模型的实现充分使用到了面向对象的思想和方法;  (5) C++异常处理模型中,异常是可以rethrow的。   从下篇文章开始,主人公阿愚对异常处理编程将进入到了一个相知的阶段。这一阶段中,阿愚将全面性地去深入了解异常处理编程中的各个细节和一些特点,并根据自己的理解阐述一些异常处理编程设计思想方面的东西。各位程序员朋友们,准备好了吗?Let's go!

阅读(3410) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册