Перехват исключений с ++ - PullRequest
3 голосов
/ 22 ноября 2010

Итак, моя программа на С ++ только что завершилась сбоем, и я получил ошибку:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Aborted

Теперь, то, что я недавно добавил в свой код, это обработчик SIGSEGV, так что если это была ошибка сегментации,он будет продолжать печатать трассировку стека.

Как мне сделать обработчик выхода для необработанных (или, более того, неуловимых) исключений в c ++?

Ответы [ 4 ]

5 голосов
/ 22 ноября 2010

Используйте функцию set_terminate , которая устанавливает функцию обработчика завершения:

Функция обработчика завершения - это функция, автоматически вызываемая, когда процесс обработки исключений по какой-либо причине должен быть прекращен.Это происходит, когда не удается найти обработчик для сгенерированного исключения или для какого-то другого исключительного обстоятельства, которое делает невозможным продолжение процесса обработки.

1 голос
/ 20 октября 2016

Добавляя к ответу @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 );
}
0 голосов
/ 22 ноября 2010

Вы можете установить свой собственный обработчик завершения с помощью set_terminate .

Вы можете перехватить все исключения C ++ с помощью предложения catch-all catch (...) {}.

0 голосов
/ 22 ноября 2010

Просто поместите try - catch(...) на уровень вашей программы.Как то так:

try {
   doStuff();
} catch( std::exception& e ) {
  //handle std::exception-derived exceptions
} catch(...) {
  //handle all other exceptions
}     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...