Сиротский блок, генерирующий исключение в структуре - PullRequest
0 голосов
/ 03 ноября 2018

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

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

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 голосов
/ 03 ноября 2018

То, что вы называете «сиротским кодом», на самом деле является функцией try-блока . Такие блоки имеют особое поведение при использовании с конструкторами и деструкторами: каждый блок catch неявно перебрасывает исключение, как если бы последний оператор был throw;. Это сделано, чтобы сделать невозможным использование объекта, который не смог завершить строительство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...