2

对 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");
}
4

2 回答 2

5

“我究竟做错了什么?”

好吧,关于所谓的异常没有出现,我没有提出任何假设。

但是这里有一些你做错的事情:

  • 将字符串传递给std::exception构造函数。那是一个非标准的扩展;std::exception没有接受字符串参数的构造函数。如果要传递异常文本,请使用std::runtime_error.

  • 在可能的抛出之后没有正常的语句意味着您不能确定是否抛出了异常。

  • 在异常消息中有换行符。非常有问题的约定。其他来源的例外不会有最后的换行符。

  • 报告错误stdout。用于stderr此。这就是它的用途。

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

于 2012-12-09T03:14:48.830 回答
1

你怎么知道没抓到?

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

\n或 输出添加到stderr.

您可能希望这fprintf最终看起来像

fprintf(stdout, "Exception Found: %s", err.what());

这意味着\n异常文本内部应作为终止符\n。如果是这样,那就这样做吧。但是您当前拥有的内容不会立即出现在屏幕上,导致您认为异常没有被捕获。

于 2012-12-09T02:46:10.857 回答