- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第13章 异
第13章 异常
异常处理: 在程序设计阶段就能充分考虑到各种意外情况,从而当环境条件出现意外或用户使用操作不当的情况下, 程序能够给出恰当的处理。使软件具有具有容错能力。
13.1异常处理的基本思想
1、问题:
发现错误的函数往往不具备处理错误的能力。
2、C十十的异常处理机制:
由发现错误的函数引发一个异常;
它的调用者能够捕获这个异常;
如果它的调用者能够处理这个错误,则处理之。
否则,继续传递给上级调用者去处理;上传过程称为传播。
这种传播会一直继续到异常被处理为止。
如果程序始终没有处理这个异常,最终它会被传到C十十运行系统那里,运行系统捕获异常后通常只是简单地终止这个程序
异常的传播方向:见下图
函数调用关系异常传播方向
函数调用关系
异常传播方向
函数g()
函数g()
函数h()引发异常函数f()捕获并处理异常
函数h()引发异常
函数f()捕获并处理异常
13.2 C++异常处理的实现
对处理异常情况的内部支持:
try:发现异常
throw:抛出异常
catch:捕捉异常
13.2.1 异常处理的语法
1、try块语法:
形式: try
复合句 //即:块语句
作用: 设置代码的保护段。
即:如果预料某段程序代码(或对一某个函数的调用)有可能发生异常,就将它放在try子句之后。以便异常产生时能够被发现。
2、throw表达式语法;
形式: throw 表达式
作用: 将异常抛出给调用者。
注意; 如果有多处要抛掷异常,应该用不同的操作数类型来互相区别,操作数的值不能用来区别不同的异常。
3、catch块语法:
形式: catch(异常类型1声明)
复合句 //即:块语句
catch(异常类型2声明)
复合句
…
作用: 捕获由throw表达式抛出的异常。并提交给异常类型匹配的复合语句进行异常处理。
4、异常处理的执行过程如下:
控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
如果在保护段执行期问没有引起异常,那么跟在try块后的catch子句就不执行,程序从异常被抛掷的try块后跟随的最后一个catch子句后面的语句继续执行下去。
如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛掷,则从通过throw操作数创建的对象中创建一个异常对象。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块。此处理继续下去直到最外层的封闭try块被检查完。
如果匹配的处理器未找到,则运行函数terminate将被自动调用,而函数terminate的默认功能是调用abort终止程序。
⑤如果找到了一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象,在形参被初始化之后,“循环展开栈”的过程开始。这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有自动对象的析构。析构以与构造相反的顺序进行〔然后catch处理程序被执行,接下来程序跳转到跟随在最后的处理程序之后的语句。
5、例13-1
#include stdafx.h
#includeiostream.h
int Div(int x,int y);
double Div(double x, double y);
void main()
{
try
{
cout5/2=Div(5,2)endl;
cout8/0=Div(8,0)endl;
cout7/1=Div(7,1)endl;
cout8.5/0.0=Div(8.5,0.0)endl;
cout6.4/0.9=Div(6.4, 0.9)endl;
}
catch(int)
{
coutinteger: except of deviding zero.\n;
}
catch(double)
{
coutdouble: except of deviding zero.\n;
}
coutthat is ok.\n;
}
int Div(int x,int y)
{
if(y==0)
throw y;
return x/y;
}
double Div(double x, double y)
{
if(y==0)
throw y;
return x/y;
}
运行结果:
将; cout8/0=Div(8,0)endl;注释掉。即:
// cout8/0=Div(8,0)endl;
则运行结果:
程序分析:
程序执行到;cout8/0=Div(8,0)endl;语句时,try发现异常,
在int Div(int
您可能关注的文档
最近下载
- 露天矿山岩质边坡工程设计规范(TCSRME 009-2021).pdf VIP
- 精品解析:2024年高中化学奥林匹克北京地区预选赛化学试题(解析版).docx VIP
- 国际音标练习(共52张).ppt VIP
- 部编版语文一年级上册教案-表格式(全册).pdf VIP
- 射血分数保留的心力衰竭诊断与治疗中国专家共识2025要点 .pdf VIP
- 2024年一级注册计量师考试题目解析.docx VIP
- 《新生儿高氨血症诊断与治疗的专家共识》解读PPT课件.pptx VIP
- 初中语文讲座:《素养导向初中语文大单元教学》课件.pdf
- 2019年阅兵PPT课件教学课件.pptx VIP
- 2025杭州电力设备制造有限公司招聘70人(第二批)笔试模拟试题及答案解析.docx VIP
文档评论(0)