初始化列表中的尝试/捕获如何工作?
-
12-12-2019 - |
题
我们认为可能发生初始化中的异常。所以我们写下try / catch块。
int f(){
throw 1;
}
class A
{
public:
A() try : _k(f())
{}
catch (int)
{
std::cout << "Exception 1" << std::endl;
}
private:
int _k;
};
.
但捕获rethrows在一个水平更深的情况下例外。那就是意味着下一个代码
try
{
A a;
} catch(int)
{
std::cout << "Exception 2" << std::endl;
}
.
将输出:
Exception 1
Exception 2
.
为什么这个尝试/ catch块的表现与普通尝试/ catch块的表现不一样?
完整代码示例: http://ideone.com/xjy2d
解决方案
似乎你的问题是:为什么函数级别尝试/捕获自动重新转移expreseoin?通过从对象的构造中抛出异常,在涉及生命之前,该对象被认为是死亡的。它的所有子object都被销毁了。也就是说,如果在施工期间抛出异常,则没有对象。如果例外不会扔,你会把一个物体的船体进入你的手中。这显然是不可取的。
其他提示
您构造的对象并没有真正构建,因此简单的返回不是一个选项。这种try0-catch总是rethrows(除非你从catch子句扔掉自己的例外)。
因为它不是普通的试用块,但函数级别尝试/捕获。除非您通过使用throw
明确完成,否则它会自动rethrows。
不隶属于 StackOverflow