std :: exception没被捕获?

时间:2012-12-09 02:40:37

标签: c++ exception

对glewInit()的调用失败(对于记录我没有答案,但是......)并且它抛出了异常。

不幸的是,它没有被我的任何捕获物捕获,甚至没有(......)。

我做错了什么?

try {

   // Initialize GLEW
    if (glewInit() != GLEW_OK)
        throw std::exception("Failed to initialize GLEW\n");


} catch ( std::system_error const& err) {
    fprintf(stdout, "System Error: %s", err.what());
    glfwTerminate(); // Free glfw if it has been allocated
    // Try Again
    this->InitWithSize(_width, _height);
} catch( std::exception const& err) {
    fprintf(stdout, "Exception Found: %s", err.what());
} catch ( ... ) {
    fprintf(stdout,"Unknown Exception Occured\n");
}

2 个答案:

答案 0 :(得分:3)

  

“我做错了什么?”

嗯,关于所谓的例外的不出现,我没有提出任何假设。

但是有些事情你做错了:

  • 将字符串传递给std::exception构造函数。这是一个非标准的扩展; std::exception没有带字符串参数的构造函数。如果要传递例外文本,请使用std::runtime_error

  • 在可能的投掷之后没有正常的声明意味着您无法确定是否抛出了异常。

  • 在异常消息中添加换行符。非常有问题的惯例。其他来源的例外情况不会有最终的换行符。

  • 报告stdout上的错误。请使用stderr。这就是它的用途。

  • 释放catch子句中的资源。一般来说,造成野蛮的混乱。不要,为此使用析构函数。

答案 1 :(得分:1)

你怎么知道它没被抓住?

我猜它实际上是由catch( std::exception const& err)子句捕获的。但是您忘记在打印字符串的末尾添加\n,因此它不会立即出现在行缓冲输出设备上。代码中的所有其他fprintf都有\n,但这个特定的\n没有。{/ p>

stderr或输出添加到fprintf

您可能希望此fprintf(stdout, "Exception Found: %s", err.what()); 最终看起来像

\n

意味着异常文本中的\n应该作为终止{{1}}。如果是这样,那就这样做吧。但是你现在所拥有的东西不会立即显示在屏幕上,导致你相信异常没有被捕获。