Необработанный обработчик исключений в C ++ - PullRequest
0 голосов
/ 09 июля 2019

Я работаю над библиотекой C ++, где я хочу иметь возможность перехватывать любые возникающие исключения, которые не были перехвачены оператором try / catch.

Единственное, что я могу найти во время поиска в Google, это блок catch (...), но это не сработает, я хочу, чтобы библиотека перехватывала все, что обычно вызывало сбой. Как и обработчик необработанных исключений в C #.

Не похоже, что есть какой-либо обработчик событий, подобный этому, в c ++. Вместо этого я подумал о том, чтобы зарегистрировать обработчик сигнала для таких вещей, как SIGSEGV AND SIGABRT, а затем, когда я получу сигнал, обработать сбой.

Это лучший способ сделать это или есть другие способы сделать то, что я пытаюсь достичь?

1 Ответ

0 голосов
/ 10 июля 2019

Мне удалось найти способ реализовать это в некоторой степени.

Как указал @ user4581301, я, вероятно, не смогу ничего сделать в случае проблемы с указателем или памяти, которая могла бы вызвать sigsegv или sigabrt, как если бы это случилось, главное приложение, вероятно, необратимо прикручен, так что не смог бы сделать что-нибудь полезное удаленно.

Однако, если выдается исключение, которое не перехватывается, я нашел способ его перехватить.

Когда моя библиотека инициализируется, я делаю следующее:

if (currentTerminationHandler == nullptr)
    {
        currentTerminationHandler = std::get_terminate();
        std::set_terminate(&unhandledTerminateHandler);
    }

Затем метод unhandledTerminateHandler использует ускоренную трассировку стека в https://www.boost.org/doc/libs/1_65_1/doc/html/stacktrace.html, чтобы вернуть зарегистрированную обратную трассировку.

Имейте в виду, что при выполнении этого при работе в Visual Studio VS ловит сбой до запуска обработчика завершения и останавливает запуск триггера завершения, поэтому чтобы обойти это, вам нужно запустить с помощью ctrl + F5, чтобы избежать его запуска внутри VS отладчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...