Мне недавно задали этот вопрос в интервью. Ниже кода был задан вопрос о поведении фрагмента. Я упоминал, что код вызовет исключение, которое будет перехвачено, но это не оказалось правильным ответом.

Я попытался отладить этот фрагмент кода, но у меня есть два вопроса.

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
Anand Kulkarni 3 Ноя 2018 в 05:06

1 ответ

Лучший ответ