【问题标题】:Catching exception in code在代码中捕获异常
【发布时间】:2009-03-08 10:28:57
【问题描述】:

我正在尝试这段代码来检查是否被零除异常:

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 块的情况下崩溃了。造成这种差异的原因可能是什么?

【问题讨论】:

    标签: c++ visual-studio-2008 exception visual-c++ visual-c++-6


    【解决方案1】:

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

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

    #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;
    }
    

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      对于__except see here 中的有效值

      【讨论】:

      • 适当的过滤器适用于实际代码,但我在回答中将其简化为示例目的。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 2019-12-28
        • 2015-04-26
        • 2012-07-17
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多