Добавляя к ответу @vitaut, если вы используете C ++ 11, вы можете проверить и получить текущее исключение в обработчике, заданном std::set_terminate
.
Согласно Даниэлю Крюглеру , который ссылается на приведенный ниже стандарт, существует неявный обработчик исключений, активный во время вызова std::terminate
, что означает, что мы можем использовать std::current_exception
для проверки того, является активным исключением, а также изучить его.
Стандарт C ++ 11 рабочий проект N3242 , раздел 15.3.7 ( выделение шахта):
Обработчик считается активным, когда инициализация для формального параметра (если есть) завершена
пункт. [Примечание: в этот момент стек будет размотан. - конец примечания] Кроме того, неявный обработчик
считается активным, когда вводится std :: terminate () или std :: непредвиденный () из-за броска . Обработчик
больше не считается активным при выходе из предложения catch или при выходе из std :: surprise () после
вошел из-за броска.
Кража из блога Анджея на C ++ , вот пример того, как это можно сделать:
[[noreturn]] void onTerminate() noexcept
{
if( auto exc = std::current_exception() ) {
// we have an exception
try{
rethrow_exception( exc ); // throw to recognize the type
}
catch( MyException const& exc ) {
// additional action
}
catch( MyOtherException const& exc ) {
// additional action
}
catch( std::exception const& exc ) {
// additional action
}
catch( ... ) {
// additional action
}
}
std::_Exit( EXIT_FAILURE );
}