引发异常的方法的命名约定 (C++)?

Naming conventions for methods that throw exceptions (C++)?

本文关键字:C++ 方法 异常 命名约定      更新时间:2023-10-16

我们正在开发一个大中型C++代码库,并且正在重构它以使其处于更好的状态。

最近有人建议我们扩展(可能(抛出异常的函数的命名约定,以便更容易确定 - 一目了然 - 函数是否可以throw异常(直接或间接通过调用throw的函数(。

虽然我发现更容易获取该信息的能力会很整洁,但我无法摆脱这可能会导致麻烦的感觉,因为没有工具辅助的方式来验证和执行该约定 - 因此你不能真正依赖约定(除了它给出提示(。

由于我对此感到撕裂和不确定,我决定从这里寻求建议:
那么,使用这样的命名约定是一个好主意/值得付出努力吗?是否有既定的约定?

它真的不会决定任何事情。这将是另一个在编程阶段无法执行的特殊约定:如果有人重构一个函数并忘记更改其名称,会发生什么?

如果有人由于函数可能产生的异常更改而被迫更改函数名称,那么由于过载解决方案,您可能会在程序中引入重大更改:弄乱函数名称可能会产生意想不到的副作用。

从 C++11 开始,您可以使用noexcept说明符,这可能会有所帮助。

原则上,有一个命名约定是个好主意,但在实践中应用是一个真正的痛苦。我在两个庞大的代码库方面的经验告诉我们,你只会在新设计中开始应用这样的约定(如果约定之前不存在的话(。

我们遵循的经验法则(对于所有函数,包括不抛出的函数(是在方法名称中反映组件名称(它的一部分(和功能(它所服务(,然后在异常消息中反映信息性文本。

引发的异常包含一条消息,如果软件直接与人类最终用户交互,则尝试反映业务/使用上下文,或者如果其内部日志,则包含更多技术性消息。命名约定没有金弹,主要是域驱动的。

这完全取决于公司软件部门的成熟程度以及它所处的领域。

它可以从 C# 中采用。 例如,对于字典,您有Add和TryAdd。

在我的示例中,我提供了一个 dll 并导出一个必须命名为 Start 的函数。 另外,由于它是dll导出,因此不应抛出。

但是现在我想在测试中包含此功能。在这里,我实际上希望它抛出,这样我就可以在测试报告上看到堆栈。

现在,尽管有所有参数,函数名称应该是信息性的。在这里,我使用启动不安全。