Как работает 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

12

Решение

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

16

Другие решения

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

2

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

2
По вопросам рекламы [email protected]