抛出异常的方法的命名约定(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.
我们正在开发中型到大型 C++ 代码库,并且正在进行重构以使其处于更好的状态。
最近有人建议我们扩展(可能)抛出异常的函数的命名约定,以便更容易确定 - 一目了然 - 函数是否可能 throw
异常(直接或间接由调用 throw
).
虽然我发现能够更轻松地获取该信息会很好,但我无法摆脱这可能会导致麻烦的感觉,因为没有工具辅助的方法来验证和执行该约定 - 因此您不能真正依赖关于公约(除了给出提示)。
因为我对此感到痛苦和不确定,所以我决定从这里寻求建议:
那么,使用这样的命名约定是否是一种很好的 idea/worth 努力,是否有为此建立的约定?
真的决定不了什么。这将是另一个在编程阶段无法执行的特殊约定:如果有人重构函数并忘记更改其名称会发生什么?
如果某人由于函数可能产生的异常变化而被迫更改函数名称,那么您可能会由于重载解析而在程序中引入重大更改:乱用函数名称可能会产生意想不到的副作用-效果。
从 C++11 开始,您可以使用 noexcept
说明符,这可能会有帮助。
原则上,有一个命名约定是个好主意,但在实践中应用是一个真正的痛苦。我在两个庞大的代码库上的经验告诉你,你只能在新设计中才开始应用这样的约定(如果约定不存在的话)。
我们遵循的经验法则(对于所有函数,包括不抛出的函数)是在方法名称中反映组件名称(它的一部分)和功能(它所服务的),然后是信息性文本在异常消息中。
抛出的异常包含一条消息,如果软件直接与人类最终用户交互,则试图反映 business/usage 上下文,或者如果它在日志内部,则包含更多技术性消息。命名约定没有金弹,主要是域驱动的。
这完全取决于软件部门在公司中的成熟程度以及它是什么领域。
可以从C#中采用。 例如,对于字典,您有 Add 和 TryAdd。
在我的示例中,我提供了一个 dll 并导出了一个必须命名为 Start 的函数。 此外,由于它是 dll 导出,因此不应抛出。
但现在我想在测试中包含此功能。这里我其实是想让它抛出,所以我可以在测试报告上看到堆栈。
现在,尽管有所有参数,函数名称仍应提供信息。这里我用的是StartUnsafe.