处理或不处理带有异常的空参数

时间:2012-03-08 12:11:21

标签: c# exception parameters

我记得读过一些异常处理指南,建议不要检查空参数。这样做的理由是,如果您按原样保留代码,则在尝试使用该参数时会引发异常(NullReferenceExcpetion)。另一种方法是显式检查null并抛出ArgumentNullException。

这可以产生相同的效果,但你需要额外的代码行。您不会编写代码来处理任何异常,因此您在测试时会在运行时遇到这些异常,然后修复代码以阻止异常发生。

我不是说我同意这个指导,但是当我第一次阅读它时它确实有意义,现在仍然有意义。

我通常只检查非私有方法的空参数,但保留私有方法抛出NullReferenceException。

有没有人知道是否有任何明确/事实上的最佳指导实践,以便我可以在需要时更新我的​​方法?

2 个答案:

答案 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));