12

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

int f(){
    throw 1;
}

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

private:
    int _k;
};

但是 catch 在更深一层上重新抛出异常。这意味着下一个代码

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

将输出:

Exception 1
Exception 2

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

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

4

3 回答 3

16

您的问题似乎是:为什么函数级 try/catch 会自动重新抛出异常?从对象的构造中抛出异常,这个对象在它复活之前就被认为是死的。它的所有子对象都被销毁。也就是说,如果在构造过程中抛出异常,则没有对象。如果异常不会抛出,您将得到一个对象的外壳。这显然是不可取的。

于 2012-10-02T20:22:44.857 回答
2

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

于 2012-10-02T20:21:41.253 回答
2

因为它不是普通的 try-catch 块,而是函数级的 try/catch。除非您使用throw.

于 2012-10-02T20:27:20.490 回答