C++ exception类+异常何时会迷失方向

来源:互联网 发布:java同步synchronized 编辑:程序博客网 时间:2024/05/29 21:29

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){}