Как работает попытка / поймать в список инициализации?
-
12-12-2019 - |
Вопрос
Мы считаем, что может произойти исключение в инициализации.Итак, мы пишем Try / Catch Block.
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
.
Почему этот блок Thry / Catch ведет себя не так же, как обычный блок Try / Catch?
Полный код примера: http://ideone.com/xjy2d
Решение
Кажется, ваш вопрос: Почему уровень функции пытается автоматически Rethrow Excloin?Сбрасывать исключение из конструкции объекта, этот объект считается мертвым до того, как речь идет о жизни.Все его сусообъекты разрушены.То есть, если исключение брошено во время строительства, нет объекта.Если исключение не бросится, вы бы получили корпус объекта в свои руки.Это явно не желательно.
Другие советы
Объект, который вы строите, на самом деле не построен, поэтому простое возвращение не является опцией.Этот вид Try0-Catch всегда вентиляции (если только вы не бросите свой исключение из олова PALL).
Потому что это не обычный блок Try-Catch, кроме как на уровне функциональности / улов.Он автоматически образуется, если вы не сделаете это явно с помощью throw
.