C++ std::未捕获异常?

C++ std::未捕获异常?,c++,exception,C++,Exception,对glewInit()的调用失败(对于记录,我也没有答案,但是…),它抛出异常 不幸的是,我的任何捕手都没有捕捉到它,甚至没有(…) 我做错了什么 try { // Initialize GLEW if (glewInit() != GLEW_OK) throw std::exception("Failed to initialize GLEW\n"); } catch ( std::system_error const& err) { fpr

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

你怎么知道它没有被抓住

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

添加
\n
或将输出添加到
stderr

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

fprintf(stdout, "Exception Found: %s", err.what());
这意味着异常文本中的
\n
应该用作终止
\n
。如果是这样,那么就这样做。但是,您当前拥有的内容不会立即显示在屏幕上,这使您相信未捕获异常

“我做错了什么?”

那么,关于所谓的例外情况没有出现,我没有提出任何假设

但以下是一些你做错的事情:

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

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

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

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

  • 释放
    catch
    子句中的资源。总的来说,会造成大混乱。不要用析构函数


我正在中断以查看是否捕获到异常,是否无法中断异常?谢谢关于输出错误的提示。我刚刚确认它还没有打印出来。@Josh Elias:我没有主意了。你的编译器是否有某种设置,比如“启用C++异常”之类的东西?值得注意的是,在这个答案被发布后,OP改变了代码。这是Visual Studio是否有可能?这里的异常处理模式可能有故障。查看和以获取更多信息。尝试在捕获中不使用常量。错误是异常。它是每次中断抛出,即使代码没有把它带到那里…但是你确实从技术上回答了我的部分问题。另一个候选者,不是在这段代码中,而是在更一般的“为什么我的异常没有被捕获”案例中,是
抛出新的一些异常
并用
捕获(一些异常和exc)
。不要堆分配异常。