初始化列表中的尝试/捕获如何工作



我们认为初始化中可能会发生异常。所以我们写 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

为什么这个尝试/捕获块的行为方式与普通的尝试/捕获块不同?

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

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

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

因为它不是一个普通的 try-catch 块,而是一个函数级的 try/catch。它会自动重新抛出,除非您使用 throw 显式执行此操作。

相关内容

  • 没有找到相关文章

最新更新