东华理工上课用c_第1页
东华理工上课用c_第2页
东华理工上课用c_第3页
东华理工上课用c_第4页
东华理工上课用c_第5页
已阅读5页,还剩20页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十二章 异常处理清华大学 郑 莉C+语言程序设计2本章主要内容异常处理的基本思想C+异常处理的实现异常处理中的构造与析构标准程序库异常处理小结3异常处理的基本思想函数f()捕获并处理异常函数h() 引发异常函数g()调用者异常传播方向调用关系异常处理的基本思想4异常处理的执行过程抛掷异常的程序段.throw 表达式;.捕获并处理异常的程序段try 复合语句catch(异常声明) 复合语句catch(异常声明) 复合语句 保护段异常处理程序C+异常处理的实现5异常处理的执行过程(续)若有异常则通过throw操作创建一个异常对象并抛掷。将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执

2、行到达try语句,然后执行try块内的保护段。如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。如果匹配的处理器未找到,则运行库函数terminate将被自动调用,其缺省功能是调用abort终止程序。C+异常处理的实现6例12-1处理除零异常#include using namespace std;int divide(int x, int y) if (y = 0)throw x;return

3、x / y;int main() try cout 5 / 2 = divide(5, 2) endl;cout 8 / 0 = divide(8, 0) endl;cout 7 / 1 = divide(7, 1) endl; catch (int e) cout e is divided by zero! endl;cout That is ok. endl;return 0;程序运行结果如下:5 / 2 = 28 is divided by zero!That is ok.C+异常处理的实现7异常接口声明可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:void fun() t

4、hrow(A,B,C,D);若无异常接口声明,则此函数可以抛掷任何类型的异常。不抛掷任何类型异常的函数声明如下:void fun() throw();C+异常处理的实现8异常处理中的构造与析构找到一个匹配的catch异常处理后初始化异常参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。异常处理的构造与析构9例12-2 异常处理时的析构#include #include using namespace std;class MyException public:MyException(const string &mes

5、sage) : message(message) MyException() const string &getMessage() const return message; private:string message;异常处理的构造与析构class Demo public:Demo() cout Constructor of Demo endl; Demo() cout Destructor of Demo endl; ;void func() throw (MyException) Demo d;cout Throw MyException in func() endl;throw My

6、Exception(exception thrown by func();10int main() cout In main function endl;try func(); catch (MyException& e) cout Caught an exception: e.getMessage() endl; cout Resume the execution of main() endl;return 0;11程序运行时输出:In main functionConstructor of DemoThrow MyException in func()Destructor of DemoC

7、aught an exception: exception thrown by func()Resume the execution of main()12标准程序库异常处理13标准程序库异常处理标准程序库的异常类exception:标准程序库异常类的公共基类logic_error表示可以在程序中被预先检测到的异常如果小心地编写程序,这类异常能够避免runtime_error表示难以被预先检测的异常14标准程序库异常处理例12-3:计算三角形面积编写一个计算三角形面积的函数,函数的参数为三角形三边边长a、b、c,三角形面积用Heron公式计算。在计算三角形面积的函数中需要判断输入的参数a、b、

8、c是否构成一个三角形,若三个边长不能构成三角形,则需要抛出异常。15标准程序库异常处理#include #include #include using namespace std;double area(double a, double b, double c) throw (invalid_argument) /判断三角形边长是否为正if (a = 0 | b = 0 | c = 0)throw invalid_argument(the side length should be positive);/判断三边长是否满足三角不等式if (a + b = c | b + c = a | c +

9、 a = b)throw invalid_argument(the side length should fit the triangle inequation);/由Heron公式计算三角形面积double s = (a + b + c) / 2;return sqrt(s * (s - a) * (s - b) * (s - c);16int main() double a, b, c;/三角形三边长cout a b c;try double s = area(a, b, c);/尝试计算三角形面积cout Area: s endl; catch (exception &e) cout E

10、rror: e.what() endl;return 0;17程序运行时输出1:Please input the side lengths of a triangle: 3 4 5Area: 6程序运行时输出2:Please input the side lengths of a triangle: 0 5 5Error: the side length should be positive程序运行时输出3:Please input the side lengths of a triangle: 1 2 4Error: the side length should fit the triang

11、le inequation18什么是异常安全(1)一个异常安全的函数,在有异常抛出时:不应泄露任何资源不能使任何对象进入非法状态反例:例9-8中的下列代码:template void Stack:push(const T &item) assert(!isFull();/如果栈满了,则报错list+top = item;/将新元素压入栈顶如果赋值过程中有异常抛出,由于top已经增1,栈顶的内容将变得不确定。19什么是异常安全(2)该函数的修正版本:template void Stack:push(const T &item) assert(!isFull();/如果栈满了,则报错listtop

12、 + 1 = item;/将新元素压入栈顶top+;即使赋值时抛出异常,由于此时top并没有真正增1,因此当前对象的状态没有改变,该函数是异常安全的。20编写异常安全程序的原则明确哪些操作绝对不会抛掷异常这些操作是异常安全编程的基石例:基本数据类型的绝大部分操作,针的赋值、算术运算和比较运算,STL容器的swap函数尽量确保析构函数不抛掷异常21避免异常发生时的资源泄漏一个函数,必须在有异常向外抛出前,释放应由它负责释放的资源。通常的解决方案把一切动态分配的资源都包装成栈上的对象,利用抛掷异常时自动调用对象析构函数的特性来释放资源。对于必须在堆上构造的对象,可以用智能指针auto_ptr加以包装。22智能指针auto_ptr(1)C+标准库的一个类模板在memory头文件中定义有一个类型参数X,表示智能指针指向数据的类型每个智能指针对象关联一个普通指针构造函数:explicit auto_ptr(X *p = 0) throw();获得与智能指针对象关联的指针:X *get() const throw();由于auto_ptr的“*”与“-”运算符已被重载,对一个auto_ptr的对象使用“*”和“-”,等价于对它所关联的指针使用相应运算符。23智能指针

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论