По крайней мере для меня, подход signal(SIGSEGV ...)
, упомянутый в другом ответе , не работал на Win32 с Visual C ++ 2015 . Что сделало работа для меня, так это использование _set_se_translator()
, найденное в eh.h
. Это работает так:
Шаг 1 ) Убедитесь, что вы включили Да с исключениями SEH (/ EHa) в Свойства проекта / C ++ / Генерация кода / Включить исключения C ++ , как упомянутый в ответе Владимир Фрицкий .
Шаг 2 ) Вызовите _set_se_translator()
, передав указатель функции (или лямбду) для нового исключения transator . Он называется переводчиком, потому что он в основном просто берет низкоуровневое исключение и перебрасывает его, как что-то более простое для перехвата, например std::exception
:
#include <string>
#include <eh.h>
// Be sure to enable "Yes with SEH Exceptions (/EHa)" in C++ / Code Generation;
_set_se_translator([](unsigned int u, EXCEPTION_POINTERS *pExp) {
std::string error = "SE Exception: ";
switch (u) {
case 0xC0000005:
error += "Access Violation";
break;
default:
char result[11];
sprintf_s(result, 11, "0x%08X", u);
error += result;
};
throw std::exception(error.c_str());
});
Шаг 3 ) Поймайте исключение, как обычно:
try{
MakeAnException();
}
catch(std::exception ex){
HandleIt();
};