【问题标题】:std::exception not being caught?std::exception 没有被捕获?
【发布时间】:2012-12-09 02:40:37
【问题描述】:

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

【问题讨论】:

标签: c++ exception


【解决方案1】:

“我做错了什么?”

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

但这里有些事情你做错了:

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

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

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

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

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

【讨论】:

  • 错误是异常情况。即使代码没有把它带到那里,它每次都会对抛出进行断点......然而,你确实在技术上回答了我的部分问题。
  • 另一个候选人,不是在这段代码中,而是在更一般的“为什么我的异常没有被捕获”的情况下,是throw new some_exceptioncatch (some_exception &exc)。不要堆分配异常。
【解决方案2】:

你怎么知道它没有被抓到?

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

添加\n 或输出到stderr

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

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

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

【讨论】:

  • 我在断点看是否被捕获,是不是不能断点异常?感谢有关输出错误的提示。
  • 我刚刚确认它仍然没有打印。
  • @Josh Elias:我没有主意了。您的编译器是否有某种设置,例如“启用 C++ 异常”或类似的设置?
  • 值得注意的是,在发布此答案后,OP 更改了代码。
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多