Обработка исключений до и после основного

Возможно ли обрабатывать исключения в этих сценариях:

  1. выдается из конструктора перед входом в main ()
  2. выбрасывается из деструктора после выхода из main ()
8
задан shiouming 8 January 2010 в 09:07
поделиться

4 ответа

  1. Вы можете завернуть свой конструктор, попробовав завести его внутрь.
  2. Нет, вы должны никогда не разрешать бросание исключений в деструктор.

Забавная менее известная возможность, как встроить 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'; }
};
22
ответ дан 5 December 2019 в 06:23
поделиться

Короткий ответ: нет.

Любой глобальный объект, который бросает исключение в своем конструкторе, вызовет необработанное исключение (т.е. termination).

Любой класс, который бросает исключение в своем деструкторе, является сломанным классом.

Использование однокнопочного паттерна вместо глобусов даст вам больше возможностей.

.
0
ответ дан 5 December 2019 в 06:23
поделиться

Возможно, можно будет установить обработчик исключений перед построением / уничтожением рассматриваемых объектов, чтобы можно было обрабатывать эти исключения.

Для конструкторов появился новый странный синтаксис, позволяющий перехватывать исключения внутри конструктора. Не уверен, как это работает, и это обычно не реализуется во многих компиляторах.

Для деструкторов вы должны заключить содержимое деструктора в try {code (); } catch (...) {} блок. Что не всегда может быть желаемым поведением, в зависимости от того, чего вы хотите достичь в этом деструкторе.

0
ответ дан 5 December 2019 в 06:23
поделиться

Да: не используйте опасные глобальные объекты!

4
ответ дан 5 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: