【发布时间】:2015-11-22 08:03:12
【问题描述】:
问题:
如果我只想显示错误消息并关闭(考虑到我可能深入程序),使用异常是否是终止程序的正确方法?或者我可以直接调用exit(EXIT_FAILURE) 之类的东西吗?
我目前在做什么:
我正在开发一个游戏项目,并试图找出在出现需要执行此类操作的错误时终止程序的最佳方法。例如,在无法加载纹理的情况下,我会显示一条错误消息并终止程序。
我目前正在这样做,但有以下例外:
int main()
{
Game game;
try
{
game.run();
}
catch (BadResolutionException & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Resolution");
return 1;
}
catch (BadAssetException & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Assets");
return 1;
}
catch (std::bad_alloc & e)
{
Notification::showErrorMessage(e.what(), "ERROR: Memory");
return 1;
}
return 0;
}
除了 bad_alloc 之外的所有异常都是我自己定义的从 runtime_error 派生的异常。
我不需要任何手动资源清理,我正在使用 std::unique_ptr 进行任何动态分配。我只需要显示错误信息并关闭程序。
研究/例外的替代方案:
我查看了很多关于 SO 和其他地方的帖子,并看到其他人说什么,从不使用异常到使用异常,但你使用它们是错误的。我还查找了明确调用 exit() 之类的方法。
使用 exit() 听起来不错,但我读到它不会通过调用堆栈返回到 main 清理所有内容(如果我能再次找到它,我会发布链接)。此外,根据http://www.cplusplus.com/reference/cstdlib/exit/,如果多个线程处于活动状态,则不应使用此选项。我确实希望至少在短时间内创建第二个线程,并且该线程中可能会发生错误。
不使用例外在此处的一些与游戏相关的回复中提到了https://gamedev.stackexchange.com/questions/103285/how-industy-games-handle-their-code-errors-and-exceptions
使用例外已在此处讨论:http://www.quora.com/Why-do-some-people-recommend-not-using-exception-handling-in-C++
我读过许多其他资料,但这些是我最近看过的。
个人结论:
由于我在处理错误和使用异常方面的经验有限,我不确定我是否走在正确的轨道上。我根据上面发布的代码选择了使用异常的途径。如果您同意我应该处理那些例外情况,我是否正确使用它?
【问题讨论】:
-
在您花费大量时间退出之前先查看std::exit。它在 RAII 世界中的清理工作做得更好。
-
@user4581301 它在哪些方面做得更好?它甚至没有展开堆栈...
-
好吧,即使你没有提到它,你也不应该在类或库代码中间调用
exit()。 stackoverflow.com/questions/22843189/… 所以,如果你想这样做,不要这样做。 -
拥有库:切勿使用退出程序的任何东西,除非情况严重。类似的适用于独立的可执行文件。
-
只要有关于何时使用异常的问题,它不可避免地会被关闭。这是一个合法的问题。停止尝试关闭这些!