基于异常的设计(3)

C++异常处理机制
本文介绍了C++中的异常处理机制,包括如何通过try-catch语句捕获并处理异常,以及如何通过不同的catch子句来匹配不同类型的异常。此外,还讨论了异常未被捕获时的处理方式以及如何使用catch-all子句来处理所有类型的异常。
系统根据被抛出来的异常与catch 子句中异常类型的匹配情况来选择catch 子句。在本例 中,异常是string 类型与下面的catch 子句相匹配 catch( string exceptionMsg ) {/* 处理异常的代码 */} 系统把控制传递给被选中的catch 子句,其中的语句将顺序执行完成之后,除非在 处理该异常的子句中又抛出异常,否则,控制将被传回到程序的当前点上。例如,如果我们已 经这样写 catch( string exceptionMsg ) { cerr << "stats(): exception occurred: " << exceptionMsg << endl; pstats[0] = pstats[1] = pstats[2] = 0; } 那么在catch 子句完成时,控制将被传递给catch 子句集后面的可执行语句。本例中 语句 pstats[ 3 ] = pstats[ 0 ]/size; 被执行,然后是do_something()调用以及返回pstats。而调用stats()的函数根本不知道 曾经有异常被抛出。 一段更为合理的异常处理代码可能如下所示 c atch( string exceptionMsg ) { cerr << "stats(): exception occurred: " << exceptionMsg << " unable to stat array " << endl; delete [] pstats; return 0 } 在上面的代码中,catch 子句直接把控制返回给外面的调用函数,我们希望外面的函数在 把返回值用作索引数组之前先测试它是否为0。 如果try 块内抛出的异常不能被相关联的catch 子句处理,那么函数将被终止,然后异 常机制再在调用stats()的函数中查找处理代码。 如果异常机制按照函数被调用的顺序回查每个函数,直到main()函数仍然没有找到处理 代码,那么它将调用标准库函数terminate()。缺省情况下terminate()函数结束程序。 一种特殊的能够处理全部异常的catch 子句如下: catch( ... ) { // 处理所有异常虽然它无法 // 访问异常对象 } 我们可以把它看作是一种捕捉所有异常catch-all 的catch 子句。 异常处理机制为统一地处理程序异常提供了语言一级的设施。第11 章与19 章将进一步 详细讨论(另一本配套的书Inside the C++ Object Model LIPPMAN96a 中讨论了实现与 性能的话题,Josée Lajoie 在LIPPMAN96b 中的文章Exception Handling: Behind the Scenses 对此也有讨论,LIPPMAN96b 中Tom Cargill 的文章Exception Handling: A False Sense of Security 则对使用异常处理过程中易犯的错误做了很好的讨论)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值