我们认为初始化中可能会发生异常。所以我们写 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
显式执行此操作。