为了不让程序由于错误而中断,C++提供了异常处理机制。
简单的说,异常的抛出与捕捉的步骤如下:
(1)在底层函数throw异常对象;
(2)将可能抛出异常的程序段嵌在try块之中;
(3) 紧随try块的catch块分别对不同类型的异常对象作出处理;
(4)如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序;
(5)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
异常对象是类对象时,用于接收异常对象有三种形式:
(1)catch(A a)
(2)catch(A& a)
(3)catch(A* a)
第一种是直接以对象 a接收,a其实是通过A类的拷贝构造函数将异常抛出的对象复制给了它,所以系统会有两次构造和析构函数的调用
第二种是以引用对象a接收,那么a不会被重新构造,而是和异常抛出的对象共同表示同一块内存,所以系统只有一次构造和析构函数的调用
第二种是以指针对象a接收,虽然a与异常抛出的对象共同指向同一块内存,但是析构内存后,还需要手动释放指针变量,即delete a。
所以,在异常对象是类对象时,catch的形参要用引用来接收,这样既方便又不容易出错。