引发异常的方法的命名约定 (C++)?
Naming conventions for methods that throw exceptions (C++)?
我们正在开发一个大中型C++代码库,并且正在重构它以使其处于更好的状态。
最近有人建议我们扩展(可能(抛出异常的函数的命名约定,以便更容易确定 - 一目了然 - 函数是否可以throw
异常(直接或间接通过调用throw
的函数(。
虽然我发现更容易获取该信息的能力会很整洁,但我无法摆脱这可能会导致麻烦的感觉,因为没有工具辅助的方式来验证和执行该约定 - 因此你不能真正依赖约定(除了它给出提示(。
由于我对此感到撕裂和不确定,我决定从这里寻求建议:
那么,使用这样的命名约定是一个好主意/值得付出努力吗?是否有既定的约定?
它真的不会决定任何事情。这将是另一个在编程阶段无法执行的特殊约定:如果有人重构一个函数并忘记更改其名称,会发生什么?
如果有人由于函数可能产生的异常更改而被迫更改函数名称,那么由于过载解决方案,您可能会在程序中引入重大更改:弄乱函数名称可能会产生意想不到的副作用。
从 C++11 开始,您可以使用noexcept
说明符,这可能会有所帮助。
原则上,有一个命名约定是个好主意,但在实践中应用是一个真正的痛苦。我在两个庞大的代码库方面的经验告诉我们,你只会在新设计中开始应用这样的约定(如果约定之前不存在的话(。
我们遵循的经验法则(对于所有函数,包括不抛出的函数(是在方法名称中反映组件名称(它的一部分(和功能(它所服务(,然后在异常消息中反映信息性文本。
引发的异常包含一条消息,如果软件直接与人类最终用户交互,则尝试反映业务/使用上下文,或者如果其内部日志,则包含更多技术性消息。命名约定没有金弹,主要是域驱动的。
这完全取决于公司软件部门的成熟程度以及它所处的领域。
它可以从 C# 中采用。 例如,对于字典,您有Add和TryAdd。
在我的示例中,我提供了一个 dll 并导出一个必须命名为 Start 的函数。 另外,由于它是dll导出,因此不应抛出。
但是现在我想在测试中包含此功能。在这里,我实际上希望它抛出,这样我就可以在测试报告上看到堆栈。
现在,尽管有所有参数,函数名称应该是信息性的。在这里,我使用启动不安全。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法