Dlaczego SetUnhandledExceptionFilter nie może przechwycić wyjątku, ale AddVectoredExceptionHandler może to zrobić

Doświadczyłem problemu, który przekazałem funkcjiSetUnhandledExceptionFilter nie został wywołany, gdy podniesiony został kod wyjątku c0000374. Ale działa dobrze z kodem wyjątku c0000005. Potem próbowałem użyćAddVectoredExceptionHandler zamiast tego i nie miał problemu, funkcja obsługi zostanie wywołana poprawnie.

Czy to błąd API? Czy mogę wszędzie używać AddVectoredExceptionHandler zamiast SetUnhandledExceptionFilter?

Obie funkcje działają poprawnie z

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

Tylko AddVectoredExceptionHandler może przechwycić ten wyjątek. (Aby udowodnić, że nie zależy to od biblioteki środowiska wykonawczego, zgłaszam wyjątek ręcznie i jest on taki sam).

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

Program testowy.

#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;
}

questionAnswers(2)

yourAnswerToTheQuestion