为什么我的UnhandledExceptionFilter没有被简单的除以零调用?

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实际上似乎并没有被调用此示例中抛出的除零异常,否则我会期望显示"得到未处理的异常"日志消息.这是为什么?

Dav*_*men 7

整数除零是未定义的行为.如果实现选择为此引发异常(或任何其他未定义的行为),那很好.如果实现选择为某些未定义的行为引发异常,那也没关系.无论面对未定义的行为时实现的是什么都没关系.这不是他们的问题.

显然,在Windows 8.1上运行的MSVC++,Win32不会在除以零时引发异常.

你永远不应该期望未定义的行为导致预期的事情.

  • 编译器也有可能优化这部分代码 - 我知道即使使用`-O1`(在MinGW上)它也能为我做到这一点 (4认同)
  • 正如我所看到你正在使用Windows ... Windows支持__try/__除了/ __ finally,它可以捕获这些异常类型.强烈建议阻止Div-0而不是捕获它. (4认同)
  • *强烈建议防止Div-0而不是捕捉它.*是的.将最大可能的有符号整数添加到自身,取负数的平方根或计算asin(2)也是如此.只是不要这样做. (3认同)

mas*_*tis 5

如果应用程序在调试器下运行,则不会调用 SetUnhandledExceptionFilter() 指定的函数,其想法是 SetUnhandledExceptionFilter() 应该仅用于生成故障转储,然后退出应用程序。如果您附加了调试器,这不是很有用,因此调试器将首先处理异常。

MSDN文档引用了这一点:

调用该函数后,如果未调试的进程中发生异常,并且该异常进入未处理的异常过滤器,则该过滤器将调用 lpTopLevelExceptionFilter 参数指定的异常过滤器函数。

  • 请注意,如果您使用 Windows 调试工具包中的“ntsd”、“cdb”或“windbg”等内容,您可以使用“sx*”系列命令来控制它,这些命令控制在调试器。默认情况下,它将在调试器中中断。 (2认同)