Возможно ли обрабатывать исключения в этих сценариях:
Забавная менее известная возможность, как встроить try-catch в конструктор:
object::object( int param )
try
: optional( initialization )
{
// ...
}
catch(...)
{
// ...
}
Да, это является действительным C++. Добавленным преимуществом здесь является то, что попытка поймает исключения , брошенные конструкторами членов данных класса, даже если они не упомянуты в инициализаторе ctor или отсутствует инициализатор ctor:
struct Throws {
int answer;
Throws() : answer(((throw std::runtime_error("whoosh!")), 42)) {}
};
struct Contains {
Throws baseball;
Contains() try {} catch (std::exception& e) { std::cerr << e.what() << '\n'; }
};
Короткий ответ: нет.
Любой глобальный объект, который бросает исключение в своем конструкторе, вызовет необработанное исключение (т.е. termination
).
Любой класс, который бросает исключение в своем деструкторе, является сломанным классом.
Использование однокнопочного паттерна вместо глобусов даст вам больше возможностей.
.Возможно, можно будет установить обработчик исключений перед построением / уничтожением рассматриваемых объектов, чтобы можно было обрабатывать эти исключения.
Для конструкторов появился новый странный синтаксис, позволяющий перехватывать исключения внутри конструктора. Не уверен, как это работает, и это обычно не реализуется во многих компиляторах.
Для деструкторов вы должны заключить содержимое деструктора в try {code (); } catch (...) {} блок. Что не всегда может быть желаемым поведением, в зависимости от того, чего вы хотите достичь в этом деструкторе.