У меня есть код, который использует стороннюю библиотеку.
Эта библиотека выдает случайное исключение нарушения прав доступа. Обычная попытка / отлов не уловила ошибку, и программа сильно упала.
Вместо этого я смог использовать __try __except, чтобы поймать ошибку, записать ее в журнал и затем изящно выйти из программы.
Сторонняя организация только что обновила свою библиотеку, и теперь небольшое подмножество записей, которые вызывали ошибки нарушения прав доступа, просто умирает в работе с «[имя программы] перестало работать»
В Visual Studio при переходе я получаю «Библиотека времени выполнения Microsoft Visual Studio C обнаружила фатальную ошибку в [имя программы]».
Я обновил свой оператор __except, чтобы поймать все (или я так верю), и это все еще происходит.
Оригинал __except:
__except (eps = GetExceptionInformation(), ((GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
? EXCEPTION_EXECUTE_HANDLER
: EXCEPTION_CONTINUE_SEARCH)) {
sprintf("error message");
result = 99;
}
Новый __except:
__except (eps = GetExceptionInformation(), ((1 == 1)
? EXCEPTION_EXECUTE_HANDLER
: EXCEPTION_CONTINUE_SEARCH)) {
sprintf("error message");
result = 99;
}
Просто дружелюбный FYI, первое выражение в вашем фильтре исключений eps = GetExceptionInformation()
кажется неиспользованным.
Кроме того, если вы хотите перехватить все исключения, __except (EXCEPTION_EXECUTE_HANDLER)
должно быть все, что вам нужно. Хотя я бы рекомендовал это только в целях отладки.
Если это не улавливает ваше исключение, возможно, библиотека пытается обработать само исключение, и в самой библиотеке происходит что-то интересное. Я бы посоветовался с поставщиком библиотеки и спросил, является ли это известной проблемой.
Других решений пока нет …