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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top