例8.1一1:求三角形的面积,有异常处理的程序 ①include<iostream:> ②#include<cmath> ③using namespace std; ④ double triangle(double,double,double); ⑤int main0 ⑥{double a,b,c; ⑦ cin>>a>>b>>c; ⑧ try ⑨ {while(a>0&&b>0&&c>0) ⑩ {cout<<triangle(a,b,c)<<endl;cin>>a>>b>>c;} ① ②catch(double) ⑧ (cout<<"a="<<a<<",b="<<b<<",c="<<c<<",that is not a traingle!"<<endl;} ④cout<<"end"<endl; ⑤return 0; ⑤} 17 double triangle(double a,double b,double c) ⑧{double s=(a+b+c/2; ⑨ if (a+b<=cllb+c<=allc+a<=b)throwa; 2②④ return sqrt(s*(s-a)*(s-b)*(s-c)); 21}
5 例8.1——1:求三角形的面积,有异常处理的程序 ① #include <iostream> ② #include <cmath> ③ using namespace std; ④ double triangle(double,double,double); ⑤ int main() ⑥ {double a,b,c; ⑦ cin>>a>>b>>c; ⑧ try ⑨ {while(a>0 && b>0 && c>0) ⑩ {cout<<triangle(a,b,c)<<endl; cin>>a>>b>>c;} ⑪ } ⑫ catch(double) ⑬ {cout<<"a="<<a<<",b="<<b<<",c="<<c<<",that is not a traingle!"<<endl;} ⑭ cout<<"end"<<endl; ⑮ return 0; ⑯ } ⑰ double triangle(double a,double b,double c) ⑱ {double s=(a+b+c)/2; ⑲ if (a+b<=c||b+c<=a||c+a<=b) throw a; ⑳ return sqrt(s*(s-a)*(s-b)*(s-c)); 21 }
程序分析:怎样进行异常处理(阅读273-274页) (1)先把可能出现异常的、需要检查的语句或程序 段放在ty后的花括号中。这些语句是正常流程 的一部分,虽然被放在ty块中,并不影响它们 按照原来的顺序执行。 (2)程序开始运行后,按正常的顺序执行到ty块 开始执行ty块中花括号内的语句。如果执行ty 块内的语句过程中没有发生异常,则catch子句 不起作用,程序转到catch子句后面的语句继续 执行
6 程序分析:怎样进行异常处理(阅读273-274页) (1)先把可能出现异常的、需要检查的语句或程序 段放在try后的花括号中。这些语句是正常流程 的一部分,虽然被放在try块中,并不影响它们 按照原来的顺序执行。 (2)程序开始运行后,按正常的顺序执行到try块, 开始执行try块中花括号内的语句。如果执行try 块内的语句过程中没有发生异常,则catch子句 不起作用,程序转到catch子句后面的语句继续 执行
(3)如果在执行ty块内的语句(包括其所调用的函 数)过程中发生异常,则throw运算符抛出一个异 常信息。 throw抛出异常信息后,流程立即离开本函数, 转到其上一级的函数(main函数),因此不会执行 throw之后语句。 throw抛出什么样的数据由程序设计者自定 可以是任何类型的数据(包括自定义类型的数据 如类对象)。 7
7 (3)如果在执行try块内的语句(包括其所调用的函 数)过程中发生异常,则throw运算符抛出一个异 常信息。 throw抛出异常信息后,流程立即离开本函数, 转到其上一级的函数(main函数),因此不会执行 throw之后语句。 throw抛出什么样的数据由程序设计者自定, 可以是任何类型的数据(包括自定义类型的数据, 如类对象)
(4)这个异常信息提供给try-catch结构,系统会寻找与之 匹配的catch子句。现在a是double型,而catch子句的括 号内指定的类型也是double型,二者匹配,即catch捕获 了该异常信息,就执行catch子句中的语句{}。 (⑤)在进行异常处理后,程序并不会自动终止,继续执行 catch子句后面的语句。 注意:并不是从出现异常点继续执行while循环。如果在 ty块的花括号内有10个语句,在执行第3个语句时出现异 常,则在处理完该异常后,其余7个语句不再执行 8
8 (4)这个异常信息提供给try-catch结构,系统会寻找与之 匹配的catch子句。现在a是double型,而catch子句的括 号内指定的类型也是double型,二者匹配,即catch捕获 了该异常信息,就执行catch子句中的语句{ }。 (5)在进行异常处理后,程序并不会自动终止,继续执行 catch子句后面的语句。 注意:并不是从出现异常点继续执行while循环。如果在 try块的花括号内有10个语句,在执行第3个语句时出现异 常,则在处理完该异常后,其余7个语句不再执行
3、异常处理的语法格式: 1)throw 表达式; 2)try-catch的结构: try {被检查的语句} catch(异常信息类型) {进行异常处理的语句} 说明(阅读274-276页) (1)被检测的函数调用必须放在ty块中,否则不起作用。 (2)try块和catch块作为一个整体出现,catch块是try- catch结构中的一部分,必须紧跟跟在try块之后,不能单独 使用,在二者之间不能插入其它语句, 9
9 3、异常处理的语法格式: 1)throw 表达式; 2)try-catch的结构: try {被检查的语句} catch(异常信息类型) {进行异常处理的语句} 说明(阅读274-276页) (1)被检测的函数调用必须放在try块中,否则不起作用。 (2)try块和catch块作为一个整体出现,catch块是try- catch结构中的一部分,必须紧跟跟在try块之后,不能单独 使用,在二者之间不能插入其它语句