【问题标题】:Orphan code block throwing Exception in struct孤立代码块在结构中抛出异常
【发布时间】:2018-11-03 02:06:37
【问题描述】:

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

我试过调试这段代码sn-p,有两个问题。

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

2。 这段不属于结构内任何方法的孤立代码的行为是什么?如果我把孤儿代码 包含在 B 的构造函数方法下,即在 B() { } 中,然后正确捕获异常。那么执行如何 流量处理这个?我的意思是B中try catch的孤儿代码属于哪个方法/函数栈?

#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);
}

【问题讨论】:

    标签: c++ exception struct


    【解决方案1】:

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

    【讨论】:

    • 如果这是真的伊戈尔,那么为什么下面的代码确实确保异常被捕获和正确处理。 B() { // 孤立代码的开始。试试 { A a; } catch(int i) { cout
    • 不,该代码实际上并不能保证。 Demo(观察未捕获的异常)。
    • 你发的链接和我发的一样。我不确定你在说什么。
    • 我在说的是 B() 现在有一个开始和结束大括号,其中 try 和 catch 块在那里,然后它与函数 try 块的特殊情况不同,其中带有构造函数案例。
    • 你是什么意思,“现在”?该链接上的代码与您的描述不同。自从我发布它以来,没有任何牙套神奇地发芽。
    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2015-11-22
    • 1970-01-01
    • 2019-09-05
    • 2015-05-07
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多