【发布时间】:2016-05-12 16:19:04
【问题描述】:
我正在使用一个库,该库需要执行某些函数来初始化库,并且需要执行其他函数来执行“清理”。具体来说,库是OpenGL(带有GLFW和GLEW),初始化函数包括glfwInit()和glewInit(),清理函数是glfwTerminate()。不过,确切的库应该无关紧要。
本着 RAII 的精神,我创建了一个 LibraryGuard 类,其构造函数初始化库,其析构函数调用必要的清理函数。
当然,库可能无法初始化。例如,可能没有适当的硬件支持,可能缺少动态库等。为了处理这些情况,我定义了LibraryGuard的构造函数,如果无法初始化库,则抛出异常。
问题是我不知道如何实际捕获这个异常。显而易见的
try {
LibraryGuard lg;
}
catch () {
// exit gracefully
}
因为LibraryGuard的析构函数在try块的末尾被调用,如果lg被成功创建,这意味着库清理函数被调用,将不起作用。
我能想到的唯一其他解决方案是 1) 不捕获异常;或 2) 将我的整个 main 函数包含在 try 块中。这两种选择都不是特别可口。
【问题讨论】:
-
我不确定我是否理解您的意思,但如果构造函数抛出异常,则不会调用析构函数。构造函数没有完成(由
return或}),所以该对象不被认为是“活动的” -
我不太明白你的问题:stackoverflow.com/a/10212864/390913
-
如果你能想象到的唯一点是 try/catch 块是在整个
main周围,那么你最好不要捕获异常并让它终止程序。无论如何,这就是你要做的。 -
@KerrekSB,不同意。您应该在 main 中捕获异常,在其中打印消息,然后
abort。这就是我会做的。 -
@AlessandroPower -- 您在
{ }块中声明了一个局部变量,因此您需要在该块中使用它。不管是try / catch块、if块、功能块等。仅仅因为它恰好是try / catch不会改变C++ 的作用域规则。