最新C++程序设计案例教程精品课件异常处理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12.1 函数模板
运行结果
程序分析
上述程序首先定义函数delta()计算Δ,如果Δ小于0,使用throw语句抛出异 常(程序中将Δ抛出),然后将可能出现异常的语句(如调用函数delta()的语 句)放在try后面的花括号中,并在catch语句块中包含对该异常的处理。程序 运行后,如果try语句块内没有发生异常,则catch子句不起作用;如果发生异 常,则对throw抛出的异常进行处理,catch子句的参数数据类型应与throw语 句后的表达式数据类型相同。
知识讲解
catch子句的参数一般只写异常信息的类型。例如: catch(double) catch语句块只检查所捕获异常信的类型,而不检查其 值。 一个try-catch结构中只允许有一个try语句块,但可以有 多个catch语句块,用来与不同的异常信息匹配。一旦某个异 常被抛出,会按照catch语句块的顺序依次寻找匹配的语句。 如果找到,就进入该catch语句块进行处理,而其他的catch语 句块就不会进入了。
13.2 异常处理中的析构
运行结果
13.2 异常处理中的析构
程序分析 在主函数main()中调用了MyFun()函数。在MyFun()函数中首先 创建对象p1,此时调用Point类的构造函数,输出“构造Point(1,2)”; 再调用p1对象的show()函数,输出x和y的值。然后又创建对象p2,此 时调用Point类的构造函数,输出“构造Point(0,0)”;再调用p2对象的 show()函数,由于p2中的x和y的值都为0,因此抛出int类型的值1,此 时不会输出x和y的值。由于MyFun()函数中没有捕获异常的catch子句, 因此异常信息转交到调用MyFun()函数的main()函数去处理。main() 函数中有捕获异常的catch子句,其捕获的异常数据类型为int。当 catch子句的异常类型声明参数被初始化后,将对从主函数中的try语 句块开始到throw抛出异常信息的过程中所有已构造但尚未析构的对 象进行析构。析构的顺序与构造的顺序相反。因此,先输出“析构 Point(0,0)”,然后输出“析构Point(1,2)”,最后执行catch块中处理异 常的语句,输出“x和y坐标都是0.”。
知识讲解
C++的异常处理机制由三部分组成:检查(try)、抛出( throw)和捕获(catch)。将需要检查的语句放在try语句块中, throw用来当发生异常时发出一个异常消息,catch语句块用于捕获 throw抛出的异常信息,如果捕获到异常信息,就对其进行处理。 throw语句的语法格式为: throw 表达式; try-catch的结构为: try { //需要检查的语句 } catch(异常信息类型) { //进行异常处理的语句 }
编程求解一元二次方程实根,要求进行异常处理,判断Δ (b2-4ac)是否大于0,成立则计算实根,否则重新输入。
12.1 函数模板
源代码展示
#include "stdafx.h" #include <iostream.h> #include <math.h> double delta(double a,double b,double c) //定义函数,计算Δ { double d=b*b-4*a*c; if(d<0) throw d; //抛出异常 return d; } int main(int argc, char* argv[]) { double a,b,c,d; cout<<"请输入a,b,c:"; cin>>a>>b>>c; while(1) //循环,直到输入正确、能计算实根后跳出
知识讲解
C++语言提供的异常处理功能不仅能处理各种不 同类型的异常,还能为异常抛出前构造的对象自动调 用析构函数。异常处理中的构造和析构的流程如下。 (1)找到一个匹配的catch块,进行处理,然后初 始化参数。 (2)将从对应的try块开始到异常被抛掷处之间够 着但尚未析构的缩影对象自动进行析构。 (3)跳出异常,从最后一个catch块之后开始继续 执行。
异常处理
异常是指程序在运行过程中,由于使用环境的变化和用户误 操作而产生的错误。异常处理是指在程序设计过程中,针对可预 测的异常编写相应的处理代码,防止异常发生后造成严重的后果。
13.1 异常处理
Add your text in here 求解一元二次方程实根时的异常处理
Click to add Text 案例引入
13.2 异常处理中的析构
Add your text in here 异常处理中调用析构函数
Click to add Text 案例引入
定义一个类Point,并定义构造函数和析构函数,以及用 于输出坐标x和y的值的函数show()。在函数show()中,如果x 和y值都为0,则抛出异常,否则输出坐标。为了清晰地展现 程序流程,通过cout语句输出相关信息,根据输出结果分析 在异常处理中是如何调用析构函数的。
13.2 异常处理中的析构
源代码展示
#include "stdafx.h" #include <iostream.h> class Point //定义类 { private: float x; float y; public: Point(float x1,float y1) //定义构造函数 { x=x1; y=y1; cout<<"构造Point("<<x<<","<<y<<")"<<endl; } ~Point() //定义析构函数 {