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

mil*_*lie 7 c# parameters exception

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

这给出了相同的效果,但你是正确的额外代码行.您不会编写代码来处理任何异常,因此您在测试时会在运行时遇到这些问题,然后修复代码以阻止异常发生.

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

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

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

Jon*_*eet 11

这给出了相同的效果,但你是正确的额外代码行

不,不.考虑:

public void TransferMoney(Account from, Account to, decimal amount)
{
    from.Debit(amount);
    to.Credit(amount);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

两者都会因例外而失败 - 但第一个会因为首先引起副作用而失败.这很糟糕,应尽可能避免.

(显然,在一个真实的情况下,这可能是交易性的,并且没有真正的伤害,但你明白我的意思.)

此外,如果一个参数被用作另一个方法的参数 - 或者更糟糕的是,存储以供以后使用 - 你可以最终从一个完全不同的地方抛出异常,这可能会使它完全不明显原来的问题是.

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

这似乎是一个相当合理的政策.如果从一些毛茸茸的代码调用私有/内部方法,我担心我可能搞砸了,我有时甚至会验证它.