我们认为可能会发生初始化异常。所以我们编写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
答案 0 :(得分:16)
看来你的问题是:为什么函数级try / catch会自动重新抛出exceptoin?通过从对象的构造中抛出异常,该对象在生命出现之前就被认为已经死亡。它的所有子对象都被销毁了。也就是说,如果在构造期间抛出异常则没有对象。如果异常不会抛出,你就会得到一个物体的船体。这显然是不可取的。
答案 1 :(得分:2)
您正在构建的对象尚未真正构建,因此简单的返回不是一种选择。这种try0-catch总是重新抛出(除非你从catch子句抛出自己的异常)。
答案 2 :(得分:2)
因为它不是普通的try-catch块而是函数级try / catch。除非您使用throw
明确地执行此操作,否则它会自动重新生成。