首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ try catch实践

c++ try catch实践
EN

Stack Overflow用户
提问于 2010-06-03 22:52:36
回答 10查看 8.2K关注 0票数 16

这在C++中被认为是很好的编程实践吗:

代码语言:javascript
复制
try {
// some code

}
catch(someException) {
// do something
}
catch (...) 
{

// left empty   <-- Good Practice???
} 
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-06-03 22:55:06

不是的!这是一种可怕的做法!

只有在main()中才应该catch (...)而不是重新抛出异常,以便捕获任何未处理的异常,并在退出前显示或记录错误。

如果你使用catch (...),你完全不知道抛出了什么异常,因此你不知道继续运行是否安全。

票数 46
EN

Stack Overflow用户

发布于 2010-06-03 23:02:58

好的做法是:

代码语言:javascript
复制
try {
// some code

}
catch( const someException & e) {
// do something
}

因为你知道你想要捕捉什么异常。

catch( ... )应该只在main()和线程的入口点(任何异常都不应该离开线程)中,当然是在catch( const std::exception &e)之后。

票数 12
EN

Stack Overflow用户

发布于 2010-06-03 22:55:44

这取决于你的应用程序和你想要解决的问题。但一般来说,接受未知的异常并不是一个好主意。至少,我会记录一些东西。

编辑析构:正如诺亚·罗伯茨所指出的,只有在析构函数中,这才是一个合理的想法。在析构函数中抑制异常很重要,否则可能会有多个异常处于活动状态。例如,如果抛出异常,并且由于堆栈展开而调用某些析构函数,则可能会发生这种情况。如果析构函数抛出一个异常,你将有两个活动的异常。然后,C++将调用std::terminate(),这将在默认情况下结束您的程序。您可以为这种情况安装一个处理程序,但是除了记录正在发生的事情之外,您可能没有什么可以做的。

尽管如此,即使在析构函数中,您也可能应该在catch (...)中记录一些内容。但是,根据析构函数的不同,您可能没有可用的日志记录工具。但在大多数情况下,您仍然可以使用std::cerr

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2967062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档