c++学习 异常
为什么要用异常
对于程序中不想发生的事情,我们常常使用判断返回值的方法来应对各种情况,但是这种方法有缺点:
1、返回值可能意义不明。
2、可能忘记处理返回值。
而引入异常后就可以解决这些问题,且异常还有两个好处:
1、表义更加丰富。
2、可以跳级。
基本语法
注: 一个try后可以接多个catch,处理多种异常。
注: 若异常被传到顶层都没有被处理,则程序会调用terminal()函数结束。
另外,catch可以捕获所有异常:
catch(...){} //不是省略的意思,真的就是三个点
栈解旋
所谓栈解旋就是说当throw抛出异常前,会把出现异常的函数中的临时变量全部释放掉(若果是类的话也会调用析构函数)。
异常接口声明
抛出异常类
throw myexception(); //这个异常类是自己定义实现的
throw后面跟异常类的构造函数,即抛出了一个异常类的匿名对象。
异常对象生命周期
1、若抛出异常的类型的是一个普通变量(这时会进行拷贝构造)或者变量的引用,则在catch处理完毕后就生命周期结束。
2、若抛出异常的类型的是一个变量的指针,则在catch处理之前,该变量就会被释放掉,所以执意要使用指针的话,可以:
throw new myexception();
并之后在catch的处理末尾将其手动释放。
c++标志异常类
由于exception是所有标准异常类的父类,所以在catch标准异常类时都可以用exception匹配。
自己的异常类
由于标准异常类的功能是有局限的,我们往往要写自己的异常类来实现个性需求,但是有几点要注意:
1、自己的异常类要继承标准异常类
2、继承标准异常类后要重载父类的what函数和析构虚函数。