使用C代码时,遇到问题,意外的是调用者抛出异常.读取您正在使用的模块的每一行,看看它是否抛出异常并不总是可行或不切实际的,如果是,则是什么类型的异常.
是否存在处理这个问题的惯用语或“最佳做法”?
我想到了以下几点:
(1)在我们的doxygen文档中,我们可以在预期抛出异常的每个函数中添加一个注释,它的类型是.
简单:简单.
Minuses:取决于用户错误.
(2)为了安全起见,我们可以有一个app-wide try / catch(…)
Pluses:我们不会有任何未被捕获的例外.
罚款:这个例外是远离投篮.很难弄清楚做什么或出了什么问题.
(3)使用异常规格
Pluses:这是处理这个问题的语言认可方式.
Minuses:需要重新构建问题库才能有效.在编译时不执行,所以违规行为会变成运行时问题,这是我想避免的!
解决方法
解决问题的惯用方式不是表示您的代码可以抛出异常,而是在对象中实现异常安全.该标准定义了对象应实现的几个异常保护:
>抛出保证:该函数不会抛出异常
>强异常安全保证:如果抛出异常,对象将处于初始状态.
>基本异常安全保证:如果抛出异常,该对象将处于有效状态.
当然,这个标准文件也是每个标准库类的异常安全级别.
这是处理C中异常的方法.而不是标记哪个代码可以或不能抛出异常,使用RAII来确保您的对象被清理,并考虑在RAII对象中实现适当级别的异常安全性,以便在没有特殊处理的情况下能够生存抛出异常.
如果异常允许您的对象处于无效状态,则异常只会造成问题.这绝对不会发生.您的对象应始终至少实现基本保证. (并实施提供适当级别的异常安全的容器类是启发性的C练习))
对于文档,当你能够确定一个函数可能抛出的异常时,一切都可以自由地记录它.但一般来说,当没有指定任何其他内容时,假设函数可能会抛出.有时候,空掷指定有时用于记录函数从不抛出的时间.如果不在那里,假设该函数可能会抛出.