Обработчики VEH, добавленные AddVectoredExceptionHandler
, будут обрабатывать исключения до того, как они достигнут обработчиков на основе фреймов.
Фильтр, установленный SetUnhandledExceptionFilter
, будет обрабатывать исключения после сбоя обработчиков на основе фреймов.
Обаобычная обработка (например, try...except
или try...catch
) и обработчики сигналов реализованы как обработчики на основе кадров, как обработчики сигналов - как последние обработчики на основе кадров.
Нет надежного способа отличить fatal и нефатальные исключения до тех пор, пока не размотается цепь.И языковые исключения (код 0xE06D7363
), иные программные исключения, и аппаратные исключения (например, нарушение доступа с кодом 0xC0000005
) - все это может быть как фатальным, так и нефатальным.
Итак, AddVectoredExceptionHandler
вряд ли пригодится.Вам придется обрабатывать set_terminate
, signal
, _set_invalid_parameter_handler
и т. Д. В дополнение к SetUnhandledExceptionFilter
.
Вы можете убедиться, что обработчики signal
вернутся к значениям по умолчанию, установив SIG_DFL
, в этом случае он вернется к обработчику, установленному SetUnhandledExceptionFilter
.
По умолчанию _set_invalid_parameter_handler
преднамеренно не возвращается к обработчику, установленному в SetUnhandledExceptionFilter
, но если вы установили свою функцию, переданную в _set_invalid_parameter_handler
, чтобы вызвать ваше собственное исключение SEH, она вернется к обработчику, установленному SetUnhandledExceptionFilter
.
Я не помню, что с set_terminate
и другими.Вам нужно будет поэкспериментировать с этим.Но в крайнем случае вы всегда можете вызвать собственное исключение SEH, перехватить его с помощью __except и перейти к UnhandledExceptionFilter
, тогда будет вызван ваш SetUnhandledExceptionFilter
обратный вызов:
__try
{
RaiseException(0xE0000001,0,0,NULL);
}
__except(UnhandledExceptionFilter(GetExceptionInformation()))
{
}