我记得读过一些异常处理指南,建议不要检查空参数。这样做的理由是,如果您按原样保留代码,则在尝试使用该参数时会引发异常(NullReferenceExcpetion)。另一种方法是显式检查null并抛出ArgumentNullException。
这可以产生相同的效果,但你需要额外的代码行。您不会编写代码来处理任何异常,因此您在测试时会在运行时遇到这些异常,然后修复代码以阻止异常发生。
我不是说我同意这个指导,但是当我第一次阅读它时它确实有意义,现在仍然有意义。
我通常只检查非私有方法的空参数,但保留私有方法抛出NullReferenceException。
有没有人知道是否有任何明确/事实上的最佳指导实践,以便我可以在需要时更新我的方法?
答案 0 :(得分:11)
这会产生相同的效果,但你需要额外的代码行
不,不。考虑:
public void TransferMoney(Account from, Account to, decimal amount)
{
from.Debit(amount);
to.Credit(amount);
}
VS
public void TransferMoney(Account from, Account to, decimal amount)
{
// Ideally do them separately
if (from == null || to == null)
{
throw new ArgumentNullException();
}
from.Debit(amount);
to.Credit(amount);
}
两者都会因异常而失败 - 但第一个会因导致副作用而失败。这很糟糕,应该尽可能避免。
(显然在一个真正的场景中,这可能是交易性的,并且没有真正的伤害,但你明白我的意思。)
此外,如果一个参数被用作另一个方法的参数 - 或者更糟糕的是,存储以供以后使用 - 最终可能会从完全不同的地方抛出异常,这种方式可能使完全非显而易见原始问题。
我通常只检查非私有方法的空参数,但保留私有方法抛出NullReferenceException。
这似乎是一个相当合理的政策。如果从一些毛茸茸的代码调用私有/内部方法,我担心我可能搞砸了,我有时会验证它。
答案 1 :(得分:0)
通过检查,您可以在异常中传递参数名称,从而简化调试。
if (x == null) throw new ArgumentNullException(nameof(x));