C++ std::未捕获异常?
对glewInit()的调用失败(对于记录,我也没有答案,但是…),它抛出异常 不幸的是,我的任何捕手都没有捕捉到它,甚至没有(…) 我做错了什么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
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
抛出新的一些异常
并用捕获(一些异常和exc)
。不要堆分配异常。