孤立代码块在struct

时间:2018-11-03 02:06:37

标签: c++ exception struct

最近在一次采访中有人问我这个问题。在下面的代码中,询问了代码段行为。我提到代码会 抛出将被捕获的异常,但结果却不是正确的答案。

我已经尝试调试这段代码片段,并且有两个问题。

1。 如果执行确实进入该行,请尝试{A a; }那么为什么catch无法捕获异常?

2。 不属于该结构内部任何方法的这段孤立代码的行为是什么?如果我输入孤立代码 包含在B的构造方法下,即B(){}内,则可以正确捕获异常。那么执行如何 流处理这个?我的意思是尝试在B中捕获的孤立代码属于哪个方法/函数堆栈?

#include<iostream>
#include<string>

using namespace std;

struct A
{
    A()
    {
        throw 2;
    }
};

struct B
{
    B()
        // start of orphan code.
        try
        {
            A a;
        }
    catch(int i)
    {
        cout << i << endl;
    }
    // end of orphan code.
};

int main(int argc, char* argv[])
{
    B b;
    cout << "3" << endl;
    return(0);
}

1 个答案:

答案 0 :(得分:1)

您所说的“孤立代码”实际上是function try block。当与构造函数和析构函数一起使用时,此类块具有特殊的行为:每个catch块都会隐式地抛出异常,就像最后一条语句为throw;一样。这样做是为了使无法使用无法完成构造的对象成为可能。