Подтвердить что ты не робот

Как работает try/catch в списке инициализации?

Мы считаем, что может произойти исключение при инициализации. Поэтому мы пишем блок try/catch.

int f(){
    throw 1;
}

class A
{
public:
    A() try : _k(f())
    {}
    catch (int)
    {
        std::cout << "Exception 1" << std::endl;
    }

private:
    int _k;
};

Но перехват исключает на одном уровне глубже. Это означает, что следующий код

try
{
    A a;
} catch(int)
{
    std::cout << "Exception 2" << std::endl;
}

выведет:

Exception 1
Exception 2

Почему этот блок try/catch ведет себя не так, как обычный блок try/catch?

Полный пример кода: http://ideone.com/XjY2d

4b9b3361

Ответ 1

Кажется, ваш вопрос: почему попытка/удержание на уровне функции автоматически отменяет исключение? Сбрасывая исключение из конструкции объекта, этот объект считается мертвым, прежде чем он оживет. Все его подобъекты уничтожены. То есть, если во время строительства возникает исключение, объекта нет. Если исключение не будет бросать, вы получите корпус объекта в свои руки. Это явно нежелательно.

Ответ 2

Объект, который вы создаете, на самом деле не построен, поэтому простой возврат не является вариантом. Этот тип try0-catch всегда повторяет (если вы не отбросите свое исключение из предложения catch).

Ответ 3

Потому что это не обычный блок try-catch, а попытка try/catch на уровне функции. Он автоматически восстанавливается, если вы не сделаете это явно, используя throw.