Ловля исключений, генерируемых без try / catch - PullRequest
3 голосов
/ 15 мая 2011

Я помню, как читал о том, как исключения могут быть перехвачены без использования try / catch. В основном, когда выбрасывается исключение, такое как «необработанное исключение», путем разыменования нулевого указателя, возникает процесс, который запускается, даже если try / catch не закодирован для исключения. Я считаю, что это как-то связано с библиотекой верхнего уровня, которую вы пишете, а затем включаете в свой код. К сожалению, документации по такому методу, похоже, не существует, но я видел / слышал о том, что такой метод уже был сделан. Может кто-нибудь объяснить, как это делается?

Ответы [ 3 ]

7 голосов
/ 15 мая 2011

В C ++ разыменование нулевого указателя вызывает неопределенное поведение, что не обязательно означает, что генерируется исключение.Например, в системах Unix вместо этого повышается сигнал SIGSEGV.

В Windows при нарушениях прав доступа возникает исключение SEH .Исключения SEH не совпадают с исключениями C ++;они обрабатываются с использованием операторов __try/__except (в отличие от операторов try/catch).Необработанное исключение SEH вызывает фильтр необработанного исключения, который можно установить с помощью SetUnhandledExceptionFilter.

#include <Windows.h>
#include <iostream>

LONG WINAPI MyFilter(EXCEPTION_POINTERS * /*ExceptionInfo*/)
{
    std::cout << "An uncaught exception was detected!\n";

    // Ultimately causes Windows Error Reporting to be invoked.
    // Use EXCEPTION_EXECUTE_HANDLER to silently terminate the application.
    return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
    SetUnhandledExceptionFilter(MyFilter);
    *(char volatile *)0 = 0;
}
2 голосов
/ 15 мая 2011

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

1 голос
/ 15 мая 2011

Это деталь реализации операционной системы, разыменование нулевого указателя не генерирует исключение C ++. В Windows, которая генерирует исключение SEH, компилятор MSVC позволяет обрабатывать их с помощью нестандартных ключевых слов __try и __except. В * nix, который генерирует сигнал, вы используете функции из заголовочного файла signal.h.

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