异常与断言?

42 c++ exception throw

可能重复:
通过断言或异常的合同测试设计?

在决定使用异常而不是断言时(或反之亦然),是否遵循经验法则.现在我只会抛出我认为会在用户端运行时发生的事情(如套接字或文件错误).我使用的几乎所有其他东西都断言.

另外,如果我要抛出一个断言,那么抛出一个很好的标准对象是什么?IIRC有std :: logic_error但是这不是一个好的对象吗?我会丢失文件或意外输入(例如从命令行而不是前端应用程序)?

Mik*_*fer 40

我的经验法则:

异常用于运行时错误条件(IO错误,内存不足,无法获取数据库连接等).

断言用于编码错误(此方法不接受空值,并且开发人员仍然传递了一个).

对于具有公共类的库,在公共方法上抛出异常(因为这样做是有意义的).断言用于捕捉你的错误,而不是他们的错误.

编辑:由于空值示例,这可能不完全清楚.我的观点是你使用断言(正如其他人指出的那样)应该永远不会发生的条件,因为这些条件永远不应该成为生产代码.在单元测试或QA测试期间,这些条件绝对必定失败.

  • 问题是从已编译程序集的发行版本中删除了断言.如果您正在编译发布版本,则无法使用它.你*必须*扔. (12认同)
  • 你能澄清为什么公共图书馆方法应该抛出异常吗?我看不出有人可能从非法论证或坏对象状态中恢复过来. (2认同)
  • 但这就是重点.他通过在缺陷到达生产之前修复缺陷来恢复. (2认同)

小智 20

断言你知道不可能发生的事情(即如果它发生了,那就是你不称职的错误).

提高程序常规控制流程未处理的异常情况.


Pau*_*ham 5

我使用断言来处理那些不应该发生但却发生的事情。当这种情况发生时,开发人员需要重新审视错误的假设。

我对其他一切都使用例外。

在可重用代码中,我更喜欢异常,因为它使调用者可以选择处理或不处理问题。只需尝试捕获并处理断言即可!


Too*_*the 4

您可以在特殊情况下使用异常。例如内存不足或网络故障。

您可以使用断言来确定是否满足某个前提条件。例如,指针不为 NULL 或整数在某个范围内。

  • “断言”和“确定”的并行性不起作用。“断言”是积极地宣告,而“确定”是学习。因此,断言以“真实”为前提,而确定表明没有特定的偏见。这并不是一个糟糕的助记符,但所建议的词源是有缺陷的。 (7认同)