抛出异常的方法的命名约定(C++)?

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

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

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

的函数

虽然我发现能够更轻松地获取该信息会很好,但我无法摆脱这可能会导致麻烦的感觉,因为没有工具辅助的方法来验证和执行该约定 - 因此您不能真正依赖关于公约(除了给出提示)。

因为我对此感到痛苦和不确定,所以我决定从这里寻求建议:
那么,使用这样的命名约定是否是一种很好的 idea/worth 努力,是否有为此建立的约定?

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

如果某人由于函数可能产生的异常变化而被迫更改函数名称,那么您可能会由于重载解析而在程序中引入重大更改:乱用函数名称可能会产生意想不到的副作用-效果。

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

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

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

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

这完全取决于软件部门在公司中的成熟程度以及它是什么领域。

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

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

但现在我想在测试中包含此功能。这里我其实是想让它抛出,所以我可以在测试报告上看到堆栈。

现在,尽管有所有参数,函数名称仍应提供信息。这里我用的是StartUnsafe.