【发布时间】:2010-09-29 09:59:17
【问题描述】:
在决定使用异常而不是断言(反之亦然)时,是否有一个经验法则可以遵循。现在我只会抛出我认为在用户端运行时会发生的事情(比如套接字或文件错误)。我使用的几乎所有其他东西都断言。
另外,如果我要抛出一个断言,那么抛出一个好的标准对象是什么?如果我没记错的话有std::logic_error,但这不是扔的好东西吗?我会为丢失的文件或意外输入(例如从命令行而不是前端应用程序)抛出什么?
【问题讨论】:
在决定使用异常而不是断言(反之亦然)时,是否有一个经验法则可以遵循。现在我只会抛出我认为在用户端运行时会发生的事情(比如套接字或文件错误)。我使用的几乎所有其他东西都断言。
另外,如果我要抛出一个断言,那么抛出一个好的标准对象是什么?如果我没记错的话有std::logic_error,但这不是扔的好东西吗?我会为丢失的文件或意外输入(例如从命令行而不是前端应用程序)抛出什么?
【问题讨论】:
我的经验法则:
异常用于运行时错误情况(IO 错误、内存不足、无法获得数据库连接等)。
断言用于编码错误(此方法不接受空值,开发人员还是传递了一个)。
对于具有公共类的库,在公共方法上抛出异常(因为这样做很有意义)。断言是用来捕捉你的错误,而不是他们的。
编辑:由于空值示例,这可能并不完全清楚。我的观点是,您将断言(正如其他人指出的那样)用于永远不会发生的条件,用于永远不会进入生产代码的条件。在单元测试或 QA 测试期间,这些条件绝对必须失败。
【讨论】:
断言你知道不可能发生的事情(即,如果发生了,那是你不称职的错)。
提出程序常规控制流未处理的异常情况。
【讨论】:
您在异常情况下使用例外。例如内存不足或网络故障。
您使用断言来确定满足某些前提条件。例如指针不为 NULL 或整数在一定范围内。
【讨论】:
我对不应该发生的事情使用断言。当这种情况发生时,开发人员需要重新审视不正确的假设。
我对其他一切都使用例外。
在可重用代码中,我更喜欢异常,因为它让调用者可以选择处理或不处理问题。只需尝试捕获和处理断言!
【讨论】:
断言是一种验证程序是否处于可能状态的方法。如果一个函数在应该只返回正整数时返回 -1,并且您有一个断言来验证这一点,那么您的程序应该停止,因为它会使您的程序处于危险状态。
【讨论】:
作为一般规则,我会从以下位置抛出异常:
我只在内部使用断言来捕获实现错误。
【讨论】: