我非常喜欢在我的代码中测试不变量和前置条件的断言行为。我经常使用它。但是现在我正在开发一个库(C++),我喜欢客户端(使用库的程序员)知道他什么时候违反了先决条件。我认为看到应用程序崩溃并解决问题比仅仅抛出未定义的行为更容易。
在这种情况下我可以只使用断言,但是当我的库准备就绪时,发布版本将禁用断言宏。我知道我可以保留它,但我不确定我是否愿意,因为有很多内部断言不需要在发布版本中进行测试。
一个实例:某些状态机具有可以添加的最大状态数。限制由客户端在构造函数中设置。然后,客户端调用方法 addState 来添加特定的状态,但是当然,他不能添加比他最初说的更多的状态。
我是不是该:
- 只是忽略限制后的状态,并且可能启动具有未定义行为的状态机(至少从客户端的角度来看)?
- 让断言保持活力并在那个时候提出断言?
- 抛出异常(我猜是一些 std::logic_error)?
- 只需向 stderr 打印一条消息并中止程序?
我不喜欢 1. 非常。这个想法是告诉客户他做错了什么。
这是引发逻辑错误异常的情况吗?还有另一种更好的可能性吗?
谢谢。