C++中的异常

来源:互联网 发布:sql 某字段相等的数量 编辑:程序博客网 时间:2024/05/19 09:14

一、异常术语

try              捕获异常,即用来捕获模块中的异常

catch          处理异常,处理try到的异常

throw         抛出异常

swallow      吞掉异常,在catch中处理了try到的异常,而没有再抛出其他异常。

propagate  传播异常,在catch中又抛出异常。

 

二、构造函数中的异常

    当构造函数抛出异常时,由于对象尚未构造完成,因此析构函数并不会调用。此时,自动变量的内存可以被释放,但是动态分配的内存需要手工释放。有以下两种释放方法:

    1. 通过显示delete/free释放

       例如:

    2. 使用智能指针来管理动态分配的内存

        例如:

 

三、析构函数中的异常

    尽管编译器允许在析构函数中抛出异常,但我们绝不要在析构函数中抛出异常。这是因为,当析构函数抛出异常时,此时还存在另外一个未被处理的异常,那么会调用terminate函数而终止程序(terminate函数最终会触发abort函数)。

 

四、异常规范(Exception Specification)

    异常规范描述了某个函数可能会抛出的异常类型,不允许该函数抛出异常规范类型以外的异常。

    例如声明一个只能抛出string和int类型异常的函数exceptionFun:

    若exceptionFun抛出了其他类型的异常,那么会调用unexcepted函数(unexcepted函数最终会触发abort函数)。

    此外,异常规范并没有改变函数的签名,因此不会影响函数的重载。

 

五、覆盖terminate函数

    通过set_terminate(FUNC)函数可以实现自己的terminate函数,其中FUNC为自己实现的函数。

 

六、栈展开(Stack Unwinding)

    栈展开是处理异常的一个过程,在这个过程中会调用从捕获异常到处理异常之间的所有局部对象。