4

我正在尝试这段代码来检查是否捕获了除以零异常:

int main(int argc, char* argv[])
{
    try
    {
      //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    catch (...)
    {
        std::cout<<"Caught exception\n";
    }
    return 0;
}

当我使用 VC6 编译时,catch 处理程序被执行并且输出是“Caught exception”。但是,当我使用 VS2008 编译它时,程序在没有执行 catch 块的情况下崩溃了。造成这种差异的原因可能是什么?

4

4 回答 4

5

在项目 -> 属性 -> 配置属性 -> c/c++ -> 代码生成 -> 启用 c++ 异常下启用结构化异常处理。

使用尝试除外。理想情况下,使用一个检查异常代码的过滤器,如果它想捕获,则返回常量信号。我在这里跳过了它,但我建议您在此处查看过滤器的示例。

#include <iostream>
#include <windows.h>

int main(int argc, char* argv[])
{
    __try
    {
        //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
            std::cout << "Caught int divison exception\n";
        else
            std::cout << "Caught exception\n";

        system("pause");
    }
    return 0;
}
于 2009-03-08T10:44:14.493 回答
2

您正在捕获由 Microsoft 的结构化异常处理 (SEH) 层生成的异常,该层是 Microsoft 特有的操作系​​统事物。正如 Mykola 建议的那样,您可能需要调整编译器选项,但请注意,此代码将无法移植到其他操作系统甚至 Windows 上运行的其他编译器。

于 2009-03-08T10:38:34.040 回答
1

转到您的项目属性,在 C/C++,代码生成下,您将找到“启用 C++ 异常”。将此选项更改为“是,有 SEH 例外”

请注意,您只能使用以下任一方法捕获此类异常:

  • try {} catch(...) {} (带省略号)
  • __try {} __except() {}(在 中带有适当的过滤器__except
  • 通过使用SetUnhandledExceptionFilter()

有关有效值,__except 请参见此处

于 2009-03-08T10:57:34.087 回答
0

在 Visual Studio 的情况下,它可以是编译器选项。但按照标准,不会抛出异常。

于 2009-03-08T10:34:06.983 回答