Почему SetUnhandledExceptionFilter не может перехватить какое-то исключение, но AddVectoredExceptionHandler может сделать

Я столкнулся с проблемой, что функция, которую я передалSetUnhandledExceptionFilter не вызывается при поднятии кода исключения c0000374. Но он отлично работает с кодом исключения c0000005. Затем я попытался использоватьAddVectoredExceptionHandler вместо этого, и у него не было проблемы, функция-обработчик вызывается правильно.

Это ошибка API? Могу ли я использовать AddVectoredExceptionHandler вместо SetUnhandledExceptionFilter везде?

Обе функции работают правильно с

// Exception code c0000005
int* p1 = NULL;
*p1 = 99;

Только AddVectoredExceptionHandler может перехватить это исключение. (Чтобы доказать, что это не зависит от библиотеки времени выполнения, я вызываю исключение вручную, и оно приводит к тому же результату.)

// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);

Тестовая программа.

#include <tchar.h>
#include <fstream>
#include <Windows.h>

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("TopLevelExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}


int _tmain(int argc, _TCHAR* argv[])
{
    AddVectoredExceptionHandler(1, VectoredExceptionHandler);
    SetUnhandledExceptionFilter(TopLevelExceptionHandler);

    // Exception code c0000374
    RaiseException(0xc0000374, 0, 0, NULL);     

    // Exception code c0000005
    // int* p1 = NULL;
    // *p1 = 99;        


    return 0;
}

Ответы на вопрос(2)

Ваш ответ на вопрос