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

时间:2012-10-02 20:17:49

标签: c++ exception exception-handling 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;
};

但是这个问题在一个层面上重新引发了异常。这意味着下一个代码

try
{
    A a;
} catch(int)
{
    std::cout << "Exception 2" << std::endl;
}

将输出:

Exception 1
Exception 2

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

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

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:2)

您正在构建的对象尚未真正构建,因此简单的返回不是一种选择。这种try0-catch总是重新抛出(除非你从catch子句抛出自己的异常)。

答案 2 :(得分:2)

因为它不是普通的try-catch块而是函数级try / catch。除非您使用throw明确地执行此操作,否则它会自动重新生成。