如何设置自己的异常处理函数?
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
参数是一个函数指针
函数类型
ExceptionInfo 是对异常描述的一个结构体
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
异常捕获函数有三种返回值
EXCEPTION_EXECUTE_HANDLER:表明异常处理完毕,程序可以退出
EXCEPTION_CONTINUE_EXECUTION:忽略此异常,从异常点继续运行。如果此时再发生异常,还会调用异常处理函数
EXCEPTION_CONTINUE_SEARCH:异常没被识别,交由上一级处理函数处理;
SetUnhandledExceptionFilter返回值,如果为0,表明此时没有附加额外的处理函数(除默认的处理函数),如果非空,则存放到当前顶层的处理函数地址。
需要注意的是,SetUnhandledExceptionFilter设置的异常处理函数为全局的处理函数,是异常发生后,最后一次处理异常的机会。如果程序被调试器附加。调试器将优先于SetUnhandledExceptionFilter设置的异常处理函数处理异常。C++自定义的try{}Catch{}比较。这是C++自定义的异常处理过程,利用SEH来处理发生的异常,如果异常发生,又出现在try{}Catch{}中 将得到优先处理。
#include <stdio.h> #include <windows.h> #include <dbghelp.h> #pragma comment(lib, "dbghelp.lib") static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionInfo) { if (pExceptionInfo) { //创建异常信息结构体 MINIDUMP_EXCEPTION_INFORMATION ExInfo; ExInfo.ThreadId = GetCurrentThreadId(); ExInfo.ExceptionPointers = pExceptionInfo; ExInfo.ClientPointers = FALSE; // 调用, 生成Dump. 98不支持 MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); } } LONG WINAPI My_UnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) { HANDLE hFile = CreateFile( TEXT("FileName.dmp"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); DumpMiniDump(hFile, pExceptionInfo); return EXCEPTION_CONTINUE_SEARCH; } int main() { SetUnhandledExceptionFilter(My_UnhandledExceptionFilter); system("pause"); return 0; }