我遇到了一个问题,当异常代码为c0000374时,我传递给SetUnhandledExceptionFilter的函数没有被调用。但是当异常代码为c0000005时,它能正常工作。
然后我尝试使用AddVectoredExceptionHandler代替它,而且它没有这个问题,处理函数被正确地调用了。
这是API的错误吗?我可以在任何地方都使用AddVectoredExceptionHandler代替SetUnhandledExceptionFilter吗?
这两个函数都可以正常工作。
这是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;
}
SetUnhandledExceptionFilter
只会在未处理异常时被调用。你是否考虑过C++运行库内部处理其他类型的异常的可能性? - user743382