C++/exception

维基教科书,自由的教学读本
< C++

<exception>头文件在STL中,定义了标准的异常类。

exception_ptr 在标准中是未定义具体实现的,因此它可能是类也可能是类型。

[编辑]

函数[编辑]

uncaught_exception() 和 uncaught_exceptions() 是两个不同的函数,分别 判断是否有未处理异常、返回未处理异常的个数 。 其中,uncaught_exceptions()函数仅在C++14开始出现。

类(模板)[编辑]

未捕获异常处理[编辑]

分为两类:

  • 当抛出的异常未被catch块捕获时,标准库的terminate()函数会被自动调用,默认情况下该函数调用abort()函数非正常终止程序。非正常终止不会析构任何对象,也不会调用任何通过atexit 或者 at_quick_exit注册的处理函数。标准库提供了set_terminate()、get_terminate()来帮助用户获取和设置处理器做一些必要的清理工作 、让用户来决定是否终止程序。
  • dynamic-exception-specification(C++11中已废弃)。函数签名中还可以指定抛出的异常类型,例如:
void function() throw(int)  {...}

如果该function函数抛出了任何非int异常类型,unexpected()函数也会被自动调用。 为此,C++标准甚至特地规定了一个bad_exception异常类来表示这种情况。 我们把这类情况也称为未捕获,该函数默认调用terminate()函数

异常嵌套[编辑]

标准库提供了三个: nested_exception异常类 、throw_with_nested函数 、rethrow_if_nested函数。异常类nested_exception非常特殊,没有继承自通用的异常基类exception。 标准指出,该类是为了继承之用,以配合其它两个函数实现嵌套异常机制。

template <class T> noreturn void throw_with_nested(T&& t);

该函数将当前异常类(正在处理的异常类)与传入类型构造成一个嵌套类型, 当前异常类为nested-exception,传入类型为outer-exception。

使用函数解嵌套并重抛,如果传入异常类型为嵌套异常,该函数会抛出被嵌套的异常:

template <class E> void rethrow_if_nested(const E& e);

异常重抛[编辑]

重抛函数需要经过一次类型转换(通过make_exception_ptr()函数):

void rethrow_exception(exception_ptr p);