Ale*_*dru 2 c++ winapi exception unhandled-exception visual-c++
我使用以下MSVC++控制台应用程序代码(在Windows 8.1,Release,Win32上运行)尝试将顶级异常返回给我:
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS exception)
{
printf("Got an unhandled exception.");
return EXCEPTION_CONTINUE_SEARCH;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
int a = 0;
int b = 0;
int c = a / b;
cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我UnhandledExceptionFilter实际上似乎并没有被调用此示例中抛出的除零异常,否则我会期望显示"得到未处理的异常"日志消息.这是为什么?
整数除零是未定义的行为.如果实现选择为此引发异常(或任何其他未定义的行为),那很好.如果实现选择不为某些未定义的行为引发异常,那也没关系.无论面对未定义的行为时实现的是什么都没关系.这不是他们的问题.
显然,在Windows 8.1上运行的MSVC++,Win32不会在除以零时引发异常.
你永远不应该期望未定义的行为导致预期的事情.
如果应用程序在调试器下运行,则不会调用 SetUnhandledExceptionFilter() 指定的函数,其想法是 SetUnhandledExceptionFilter() 应该仅用于生成故障转储,然后退出应用程序。如果您附加了调试器,这不是很有用,因此调试器将首先处理异常。
MSDN文档引用了这一点:
调用该函数后,如果未调试的进程中发生异常,并且该异常进入未处理的异常过滤器,则该过滤器将调用 lpTopLevelExceptionFilter 参数指定的异常过滤器函数。