基于异常的设计(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 则对使用异常处理过程中易犯的错误做了很好的讨论)
中,异常是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 则对使用异常处理过程中易犯的错误做了很好的讨论)
相关文章推荐
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
- JDBC学习之路(五)基于MVC框架的JDBC异常与设计模式处理
- 基于异常的设计(2)
- 2.6 基于异常的设计
- 基于异常的设计(1)
- 基于ARM 的嵌入式系统程序开发要点--(四)异常处理机制的设计
- 基于JAVA的简单界面设计:记事本
- 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)
- Framework的设计与应用--基于Windows Forms的应用开发实践
- 基于redis的延迟消息队列设计
- 基于S3C2410的触摸屏驱动程序设计
- 基于积分系统的AI设计
- 基于地图的工作流设计器,及基于地图的业务流程办理界面(四)
- 基于FPGA的串口通讯设计与实现
- 基于MySQL的BBS设计(2)
- 基于人本理念的绩效管理体系设计(四)
- 基于 Cocos2d-x 引擎的游戏框架设计
- 基于角色的权限设计(一)
- Java EE项目中异常设计及处理总结