C++exception类位于头文件<exception>中
C++异常的主要目的是为设计容错程序提供语言支持
一、exception类用作其他异常类的基类
1>logic_error类(继承自exception类) :通过合理的编程可以避免逻辑错误
在头文件<stdexcept>中定义,逻辑异常表明存在可以通过编程修复的问题
domain_error:定义域或值域错误
invalid_error:传递的值不符合要求
length_error:没有足够的空间执行所需操作,例如string类的append()方法
out_of_bounds :指示索引错误,例如数组下标索引
2>runtime_error类(继承自exception类):在运行期间发生但难以预计和防范的错误
在头文件<stdexcept>中定义,运行时异常表明无法避免的问题
range_error:计算的结果不在函数允许的范围内,但没有上溢,也没有下溢
overflow_error:上溢错误
underflow_error:下溢错误
3>bad_alloc类(继承自exception类):在头文件<new>中
当new出现内存分配问题时,C++提供了两种方式处理:
i>返回一个空指针
ii>引发bad_alloc异常
二、异常何时会迷失方向:
1>意外异常:异常,如果是在带异常规范的函数中引发的,则必须与规范列表里的某个异常匹配,若没有匹配的,则为意外异常,默认情况下,会导致程序异常终止
2>未捕获异常:异常如果不是在函数中引发的(或者函数没有异常规范),则它必须被捕获。如果没被捕获(没有try块或没有匹配的的catch块),则为未捕获异常。默认情况下,将导致程序异常终止
3>可以修改这种默认设置(存在意外异常或未捕获异常)
3.1>未捕获异常:此异常不会导致程序立刻终止
(terminate()、set_terminate()都在exception头文件中声明)
程序首先调用函数terminate()---->默认情况下,terminate()调用abort()函数,
可以通过set_terminate()函数指定terminate()调用的函数,修改这种行为
若set_terminate()函数调用多次,则terminate()函数将调用最后一次set_terminate()设置的函数
例如:
set_terminate(MyQuit);
void MyQuit(){...}
此时若出现未捕获异常,程序将调用terminate(),而terminate()将调用MyQuit()
3.2>意外异常:
发生意外异常时,程序将调用unexcepted()函数--->unexpected()将调用terminate()函数--->terminate()在默认情况下调用abort()函数
可以通过set_unexcepted()函数,修改这种默认行为,但unexpected()函数受限更多
i>通过terminate()、abort()、exit()终止程序
ii>引发异常
#引发的异常与原来的异常规范匹配,则可以用预期的异常取代意外异常
#引发的异常与原来的异常不匹配,且异常规范中没有包括bad_exception类型(继承自exception类),则程序将调用terminate()
#引发的异常与原来的异常不匹配,且原来的异常规范中包含了bad_exception类型,则不匹配的异常将被bad_exception异常所取代
如果要捕获所有异常,步骤如下:
#include<exception>
using namespace std;
void myUnexception()
{
throw bad_exception();
}
set_unexcepted(myUnexception)
...
function()throw(...,bad_exception);
try{}
catch(bad_exception &be){}