Глобальная обработка исключений в C ++ - PullRequest
7 голосов
/ 06 декабря 2010

Могу ли я реализовать глобальную обработку исключений в C ++?Мое требование: попробовать ... блок catch не используется в куске кода, поэтому должен быть глобальный обработчик исключений, который будет обрабатывать все необработанные исключения.

Могу ли я достичь этого, пожалуйста, дайте ваше ценное предложение :)

Ответы [ 4 ]

5 голосов
/ 06 декабря 2010

Я всегда обертываю самую внешнюю функцию в try-catch следующим образом:

int main()
{
   try {
      // start your program/function
      Program program; program.Run();
   }
   catch (std::exception& ex) {
      std::cerr << ex.what() << std::endl;
   }
   catch (...) {
      std::cerr << "Caught unknown exception." << std::endl;
   }
}

Это поймает все.Хорошая обработка исключений в C ++ не сводится к написанию try-catch повсюду, а к тому, чтобы понять, где вы знаете, как с этим справиться (как вы, похоже, и хотите).В этом случае единственное, что нужно сделать, - это написать сообщение об ошибке в stderr, чтобы пользователь мог на него воздействовать.

4 голосов
/ 06 декабря 2010

В C ++ функция terminate вызывается, когда исключение не обработано. Вы можете установить свой собственный обработчик завершения с помощью функции set_terminate. Недостатком является то, что ваш обработчик завершения никогда не может вернуться; он должен завершить вашу программу с некоторым примитивом операционной системы. По умолчанию это просто вызов abort()

4 голосов
/ 06 декабря 2010

вы можете использовать комбинацию set_terminate и current_exception()

0 голосов
/ 06 декабря 2010

Когда возникает исключение, если оно не перехватывается в этот момент, оно поднимается вверх по иерархии до тех пор, пока оно не будет фактически перехвачено. Если нет кода для обработки исключения, программа завершается.
Вы можете запустить определенный код до завершения, чтобы выполнить очистку, используя ваши собственные обработчики set_unexpected или set_terminate

...