【问题标题】:How should one deal with invalid business objects in code?应该如何处理代码中的无效业务对象?
【发布时间】:2011-01-23 11:16:31
【问题描述】:
假设您有一个业务对象,其当前状态意味着您的代码中存在某种错误。或者基本上任何您正在使用自己的数据但它处于不应该违反某些规则的状态的情况。我通常喜欢检查这些条件和假设,因为它可以让我在更接近其源头的早期发现错误。但是,如果此类逻辑检查失败,最佳做法是什么?
我知道 Debug.Assert 语句对此非常方便,但我不太喜欢它们,因为它们只出现在调试模式,而不是在测试或发布阶段,显然仍然包含许多此类错误。我宁愿被告知此检查失败,而不是尝试调试代码中稍后发生的问题。对我来说,解决方案看起来像是抛出某种异常。这是个好主意吗?
【问题讨论】:
标签:
.net
assert
business-logic
【解决方案1】:
我通常会检查业务对象本身是否存在此类问题,并在忽略会导致对象状态无效的情况下抛出异常。此类例外包括(但不限于):
-
IllegalArgumentException 用于传递不可接受的参数(例如,在不允许的情况下为 null)
-
IllegalStateException 当对象可能被驱动到不正确的状态时(与 参数 无效的场景不同)
因此,业务对象本身永远不会无效。
我会立即检查这些情况。我迫切希望避免的情况是修改一个对象,使其处于无效状态,然后才发现这一点(可能是几年后 - 想象一下序列化这样的对象并在一年后反序列化它)。这将使发现这些问题的根源几乎是不可能的。
我当然希望在生产以及开发/测试阶段进行这些检查。通常,与正常操作所需的时间相比,执行此类检查的成本可以忽略不计,尤其是与您从此类场景恢复所需的时间相比。
【解决方案2】:
是的,我认为这是正确的做法。异常会冒泡,不会被忽视,让您回到问题的根源。
【解决方案3】:
你完全正确,抛出异常。
您可以扩展 Exception 类并在这些情况下使用您的扩展版本,这样您就可以在链上进一步处理它们,以便在必要时记录和暂停应用程序。
try
{
}
catch(MyException ex)
{
ex.LogError();
if(ex.IsCritical)
throw ex;
}