我正在使用GLUTesselator并且每隔一段时间EndContour()失败,所以我这样做了:
try
{
PolygonTesselator.End_Contour();
}
catch (int e)
{
renderShape = false;
return;
}
为什么它仍会崩溃,它应该正确执行catch代码? 我怎么能解决这个问题?
由于
答案 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)
两件事: