帮助Try Catch

时间:2010-08-01 20:34:22

标签: c++ opengl

我正在使用GLUTesselator并且每隔一段时间EndContour()失败,所以我这样做了:

         try
        {
            PolygonTesselator.End_Contour();
        }
        catch (int e)
        {
            renderShape = false;
            return;
        }

为什么它仍会崩溃,它应该正确执行catch代码? 我怎么能解决这个问题?

由于

7 个答案:

答案 0 :(得分:10)

PolygonTesselator.End_Contour();崩溃或引发异常?

请注意,真正的“崩溃”(段错误,非法指令等)不会在C ++意义上引发异常。

在这些情况下,CPU会触发中断 - 这有时也称为异常,但与C ++异常无关。

在C ++中,您运行的是真正的CPU - 而不是像Java中的虚拟机那样,每次内存违规都会导致语言执行,如NullPointerException或ArrayOutOfBoundsException。

在C / C ++中,CPU异常/中断/陷阱由操作系统处理并作为“信号”转发到进程。您可以捕获信号,但通常这对崩溃没有帮助(SIGSEG,SIGILL,SIGFPU等)。

答案 1 :(得分:4)

您正在获得SEH例外或结构化异常处理。这些异常是由Windows在完全不同的系统下引发的,因为SEH早于C ++,并且不能被标准的C ++ catch块捕获(但是MSVC确实提供了SEH捕获)。

或者,如果您使用的是Unix,则内核也不会使用C ++异常。它使用信号。我不假装理解信号,因为我没有为Unix开发,但我非常确定它们不是C ++异常。

您违反了无法取消引用NULL指针的硬件规则。您将通过异常或信号获得操作系统级别的错误。你不能像这样在C ++ catch块中捕获这些东西。

编辑:如果您在Windows上使用MSVC并拥有最新的编译器,则可以启用/ EHa,它允许您捕获结构化异常以及C ++异常。我编写了这个代码,其功能如下所示:

int main() {
    std::string string = "lolcakes";
    try {
        Something s;
        int i, j;
        i = 0; j = 1;
        std::string input;
        std::cin >> input;
        if (input == "Structured")
            int x = j / i;
        else
            throw std::runtime_error("Amagad hai!");
    }
    catch(std::runtime_error& error) {
        std::cout << "Caught a C++ exception!" << std::endl;
    }
    catch(...) {
        std::cout << "Caught a structured exception!" << std::endl;
    }
    return main();
}

结构化例外包括访问冲突,您的特定错误。

答案 2 :(得分:2)

因为当异常到达时你想要做的就是将'renderShape'设置为false我会推荐以下代码:

     try
    {
        PolygonTesselator.End_Contour();
    }
    catch (...) // takes any type of exception
    {
        renderShape = false;
        return;
    }

当然,如果你真的无法将源代码修复到异常本身!!

答案 3 :(得分:1)

  

为什么它仍然会崩溃,它应该   执行catch代码对吗?怎么样   我可以解决这个问题吗?

最有可能的原因是你实际上没有抓到被抛出的东西。你确定PolygonTesselator.End_Contour();会抛出一个int吗?

答案 4 :(得分:1)

如果你的程序失败并显示消息error reading from location 0x000000000,那么它不会因为异常而失败,而是因为段错误。您可以使用segvcatch实用程序将段错误转换为可捕获的异常。看看他们的例子。

答案 5 :(得分:1)

如上所述,这是SEH例外 如果您使用的是Visual Studio,则可以将项目配置为捕获try / catch块中的SEH异常。

  

项目属性&gt; C / C ++&gt;码   生成&gt;启用C ++例外&gt;   是的,有SEH例外

答案 6 :(得分:1)

两件事:

  • 如果您使用的是VC 6或更新版本,请使用__try {} __,但(EXCEPTION_EXECUTE_HANDLER){}除外。它会赶上SE。 try / catch仅捕获C ++异常
  • 我在使用GLU时遇到了困难,所以我可以告诉你:如果你可以设置正常,请设置IT。但除此之外,它确实非常稳固。