初始化列表中的try/catch如何工作?

Sea*_*ull 12 c++ exception-handling exception try-catch in-class-initialization

我们认为可能会发生初始化异常.所以我们编写try/catch块.

int f(){
    throw 1;
}

class A
{
public:
    A() try : _k(f())
    {}
    catch (int)
    {
        std::cout << "Exception 1" << std::endl;
    }

private:
    int _k;
};
Run Code Online (Sandbox Code Playgroud)

但是这个问题在一个层面上重新排除了异常.这意味着下一个代码

try
{
    A a;
} catch(int)
{
    std::cout << "Exception 2" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

将输出:

Exception 1
Exception 2
Run Code Online (Sandbox Code Playgroud)

为什么这个try/catch块的行为与普通的try/catch块不同?

完整代码示例:http://ideone.com/XjY2d

Die*_*ühl 16

看来你的问题是:为什么函数级try/catch会自动重新抛出exceptoin?通过从对象的构造中抛出异常,该对象在生命出现之前就被认为已经死亡.它的所有子对象都被销毁了.也就是说,如果在构造期间抛出异常则没有对象.如果异常不会抛出,你就会得到一个物体的船体.这显然是不可取的.