在代码中捕获异常

时间:2009-03-08 10:28:57

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

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

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 个答案:

答案 0 :(得分:5)

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

使用try除外。理想情况下,使用过滤器检查异常代码,然后返回常量信号,如果它想要捕获。我已经跳过了这一点,但我建议你看一下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;
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

请注意,您只能使用以下方法捕获这些异常:

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

有关__except see here

中的有效值

答案 3 :(得分:0)

在Visual Studio中,它可以是编译器选项。 但按标准来说,不会抛出异常。