检查函数参数的最佳方法:检查null或try / catch

时间:2010-10-21 14:40:07

标签: c# exception-handling methods robustness

在实现/使用返回或使用对象实例的方法时,检查函数参数的最优雅方法是什么?

致电方法:

someType GetSomething(object x)
{
    if (x == null) {
        return;
    }

    //
    // Code...
    //
}

或更好:

someType GetSomething(object x)
{
    if (x == null) {
        throw new ArgumentNullException("x");
    }

    //
    // Code...
    //
}

通话方式:

void SomeOtherMethod()
{
    someType myType = GetSomething(someObject);

    if (someType == null) {
        return;
    }

}

或更好:

void SomeOtherMethod()
{
    try {
        someType myType = GetSomething(someObject);
    } catch (ArgumentNullException) {
    }
}

在浏览类似问题时,不使用try / catch的原因是性能。但恕我直言,尝试捕捉看起来更好:)。

那么,哪种方式更“优雅”?

4 个答案:

答案 0 :(得分:9)

如果传入null无效,则抛出异常(即 - 这是永远不会发生的异常情况。)

如果null参数 有效,则返回相应的对象。

一般来说,接受null参数是不良做法 - 这违背了最不出意的原则,并要求来电者知道它是有效的。< / p>

答案 1 :(得分:4)

就优雅而言,很难超越Code Contracts

Contract.Requires(x != null);

答案 2 :(得分:2)

您应该只对例外情况使用例外。如果您希望参数可能(合法地)为null,则应该检查它 - 不要使用异常。 IMO你应该在调用站点检查null(如果调用之前的),如果将null传递给你的方法是没有意义的。

答案 3 :(得分:0)

在您的示例中,GetSomthing是私有的。这意味着您可以跟踪所有调用者并确保Null值不会被传入,例如

 if (x != null)
   someType myType = GetSomthing(x)
 else
   // Initialize  x or throw an InvalidOperation or return whatever is correct

然而,如果它不是真的私密,那么你应该像Oded那样做,其他人说。检查它是否为null并在大多数情况下抛出ArguementExecption。