
第八章C++工具 8.1异常处理 8.2命名空间 8.3使用早期的函数库 0
0 8.1 异常处理 8.2 命名空间 8.3 使用早期的函数库 第八章 C++工具

8.1异常处理 1、异常处理的任务 >程序的错误有两种:一种是编译错误,即语法错误。 如果使用了错误的语法、函数、结构和类,程序就无 法被生成运行代码。另一种是在运行时发生的错误 它分为不可预料的逻辑错误和可以预料的运行异常。 例如:程序执行时遇到除数为、下标越界、无法打开 文件、输入数据类型错误等导致程序错误。 >异常处理的任务:事先分析程序运行时可能出现的错 误,制定相应的处理方法。 1
1 8.1 异常处理 1、异常处理的任务 ➢ 程序的错误有两种:一种是编译错误,即语法错误。 如果使用了错误的语法、函数、结构和类,程序就无 法被生成运行代码。另一种是在运行时发生的错误, 它分为不可预料的逻辑错误和可以预料的运行异常。 例如:程序执行时遇到除数为、下标越界、无法打开 文件、输入数据类型错误等导致程序错误。 ➢ 异常处理的任务:事先分析程序运行时可能出现的错 误,制定相应的处理方法

2、异常处理的方法 >在大的系统中,包含多个模块,每个模块又包 含许多函数,函数之间互相调用,比较复杂。 如果在每个函数中都设置处理异常的程序段, 会使程序过于复杂和庞大。 >C++采取的办法是:如果执行一个函数过程中 出现异常,可以不在本函数中立即处理,而是 发出一个信息,传给它的上一级,若它的上一 级捕捉到这个信息也不能进行处理,再传给上 一级的函数,若到最后一级还无法处理,只好 异常终止程序
2 2、异常处理的方法 ➢在大的系统中,包含多个模块,每个模块又包 含许多函数,函数之间互相调用,比较复杂。 如果在每个函数中都设置处理异常的程序段, 会使程序过于复杂和庞大。 ➢C++采取的办法是:如果执行一个函数过程中 出现异常,可以不在本函数中立即处理,而是 发出一个信息,传给它的上一级,若它的上一 级捕捉到这个信息也不能进行处理,再传给上 一级的函数,若到最后一级还无法处理,只好 异常终止程序

8.1异常处理 2、异常处理的方法 >C++语言异常处理机制的基本思想是将异常的检测与处理 分离,当在一个函数体中检测到异常条件存在,但无法确 定相应的处理方法时,将引发一个异常,并由函数的直接 或间接调用检测并处理这个异常。这一基本思想用3个保 留字实现:try、throw和catch。其作用是: (1)ty:标识程序中异常语句块的开始,把需要检 查的语句放到try块中。 (2)throw:当出现异常时发出异常信息。 (3)catch:捕捉异常信息并处理。 3
3 8.1 异常处理 2、异常处理的方法 ➢ C++语言异常处理机制的基本思想是将异常的检测与处理 分离,当在一个函数体中检测到异常条件存在,但无法确 定相应的处理方法时,将引发一个异常,并由函数的直接 或间接调用检测并处理这个异常。这一基本思想用3个保 留字实现:try、throw和catch。其作用是: (1)try:标识程序中异常语句块的开始,把需要检 查的语句放到try块中。 (2)throw:当出现异常时发出异常信息。 (3)catch:捕捉异常信息并处理

例8.1:求三角形的面积,没有异常处理的程序 ①include ②include ③ using namespace std; ④ double triangle(double,double,double); ∥函数声明 ⑤ int main() ⑥⑧ double a,b,c; ⑦ cin>>a>>b>>cj ⑧ while(a>0&&b>0&&c>0) ⑨ cout>a>>b>>c; ① ② return 0; } ④ ⑤double triangle(double a,double b,double c)∥函数定义 ⑥{double area,s; ⑦ s=(a+b+c)/2; ⑧ area=sqrt(s*(s-a)*(s-b)*(s-c)); ⑨ return area; 四} 4
4 例8.1:求三角形的面积,没有异常处理的程序 ① #include ② #include ③ using namespace std; ④ double triangle(double,double,double); //函数声明 ⑤ int main() ⑥ { double a,b,c; ⑦ cin>>a>>b>>c; ⑧ while (a>0 && b>0 && c>0) ⑨ { cout>a>>b>>c; ⑪ } ⑫ return 0; ⑬ } ⑭ ⑮ double triangle(double a,double b,double c) // 函数定义 ⑯ { double area,s; ⑰ s=(a+b+c)/2; ⑱ area=sqrt(s*(s-a)*(s-b)*(s-c)); ⑲ return area; ⑳ }

例8.1一1:求三角形的面积,有异常处理的程序 ①include ②#include ③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>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 ② #include ③ 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>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块之后,不能单独 使用,在二者之间不能插入其它语句