Обработка исключений до и после основного - PullRequest
8 голосов
/ 08 января 2010

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

  1. выдается из конструктора перед входом в main ()
  2. выбрасывается из деструктора после выхода из main ()

Ответы [ 4 ]

22 голосов
/ 08 января 2010
  1. Вы можете свернуть свой конструктор с помощью внутри него try-catch.
  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'; }
};
4 голосов
/ 08 января 2010

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

0 голосов
/ 08 января 2010

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

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

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

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

0 голосов
/ 08 января 2010

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

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

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

...