如何从成员析构函数中捕获异常

Luk*_*řík 5 c++ destructor function-try-block

我想知道是否(以及如何)捕获成员析构函数中抛出的异常.例:

#include <exception>

class A
{
public:
    ~A() {
        throw std::exception("I give up!");
    }
};

class B
{
    A _a;
public:
    ~B() {
        // How to catch exceptions from member destructors?
    }
};
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 7

是的,你可以使用function-try-block捕获这样的异常:

class B
{
    A _a;
public:
    ~B() try {
        // destructor body
    }
    catch (const std::exception& e)
    {
        // do (limited) stuff
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,对于这样的例外,你真的无能为力.该标准指定您不能访问该B对象的非静态数据成员或基类.

此外,你不能使异常沉默.与其他函数不同,一旦析构函数(或构造函数)的function-try-block处理程序完成执行,就会隐式重新抛出异常.

总而言之,析构函数应该不会抛出异常.