Возможно ли поймать ошибку segfault с помощью try / catch?

#c #try-catch

#c #попробуйте-поймайте

Вопрос:

Я провел этот тест, чтобы посмотреть, что произошло:

 try
{
    int *x = 0;
    *x = 1234;
}
catch(...)
{
    cout << "OK";
}
  

Но он выдает ошибку segfault, почему он не улавливает ошибку segfault?

Комментарии:

1. Ошибка сегмента — это сигнал, а не исключение?

2. @cheroky «Ошибка в сегменте — это сигнал, а не исключение?» ДА.

3. Кто-нибудь может скомпилировать и запустить с Visual C без get segfault?

Ответ №1:

Нет, вы не можете.

SEGFAULT Не является обычным исключением.

Показываемый вами код — это просто неопределенное поведение, и может произойти что угодно. Нет гарантии, что в конечном итоге это приведет к возникновению исключения.

Ответ №2:

Этот ответ очень специфичен для WINDOWS.

Вы можете использовать Структурированную обработку исключений.

Вы должны вызвать «SetUnhandledExceptionFilter»https://msdn.microsoft.com/en-us/library/ms680634 (v= против 85).aspx

прототип использования:

Вы должны зарегистрировать функцию в начале приложения

 SetUnhandledExceptionFilter(UnhandledExceptionFilterFunction);
  

Определите свою зарегистрированную функцию, ведите свой бизнес.
Обычно люди собирают дампы ядра и отправляют электронные письма команде разработчиков.

 LONG WINAPI UnhandledExceptionFilterFunction(PEXCEPTION_POINTERS exception)
{


// The exception information is available in  PEXCEPTION_POINTERS 

}
  

Смотрите ссылку ниже для PEXCEPTION_POINTERS
https://msdn.microsoft.com/en-us/library/windows/desktop/ms679331 (v = против 85).aspx

Вот список записей исключений, которые вы получаете в «PEXCEPTION_POINTERS». Первый — «EXCEPTION_ACCESS_VIOLATION» (в терминах LINUX SEGFAULT)

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363082 (v = против 85).aspx

Комментарии:

1. Я не вижу, как этот вопрос относится конкретно к Windows.

2. Я согласен. Вопрос не относится конкретно к Windows. Вот почему я упомянул самое первое в своем ответе. Но может помочь любому программисту Windows, который заходит на эту страницу.

3. Это также может заставить людей задуматься о том, почему нельзя в LINUX или UNIX-подобных системах.