您的位置:首页 > 其它

基于异常的设计(3)

2009-06-12 00:08 120 查看
系统根据被抛出来的异常与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 则对使用异常处理过程中易犯的错误做了很好的讨论)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: