你在C++异常处理方面有哪些最佳实践?

14

我在互联网上搜索了很多关于这个主题的文章。然而,我发现没有一份完整的清单来验证我们代码的异常安全性。

因此,我希望从您那里收集有价值的C++异常处理最佳实践。

我先列出了自己的一些做法:

  1. 如果析构函数中有任何异常,请捕获所有异常:

    struct A
    {
        ~A()
        {
            try
            {
                // Here may throw exceptions
            }
            catch (std::runtime_error& e)
            {}
            catch (...)
            {
                logging("...");
            }
        }
    };
    
  2. 在异常信息中添加函数名、源文件名和行号。 __func____FILE____LINE__ 是好朋友。

  3. 永远不要使用异常规格说明(exception specifications)。原因在书籍《C++ Coding Standards》中有所阐述。

你的问题是什么?


2
实际上,__func__ 是一个好朋友。我们都回避 __FUNCTION__,因为它不在标准中。 - chris
5
按值传递参数,按const引用捕获异常。 - Alok Save
1
@AlokSave,为什么要用const?非const引用更好捕获异常! - hate-engine
1
@hate-engine:是什么让你得出这个结论的? - Alok Save
非常数意味着可能会复制,这意味着可能会出现std::bad_alloc,这意味着std::terminate。const ftw. - paulm
1个回答

19

我知道这可能更适合作为评论而不是答案,但由于我链接的资源回答了您所有的问题和更多问题,我认为将其发布为答案也没关系,只是为了使它更加突出和/或相关。

并且由于我根本无法比原始内容更好地总结它,所以我甚至不会尝试进行简短的摘要,因为我会冒着扭曲它或给出有偏见的概述的风险。

只需观看Jon Kalb关于异常安全编码的两部分演讲即可。就是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接