检查方法的参数时是否抛出异常?

时间:2017-07-27 15:52:01

标签: c# exception

我喜欢在使用它们之前检查方法的所有参数是否都有正确的信息。像这样:

public method(MyType param1)
{
try
{
    if(param1 == null)
    {
        throw new ArgumentNullException("Error1");
    }
    if(param1.Property1 == null)
    {
        throw new ArgumentNullException("Error2");
    }

    if(param1.Property1.Amount <= 0)
    {
        throw new ArgumentException("Error3");
    }

    ...


    //Do what I need with the parameter
}
catch { throw; }
}

然而,in this post有人评论说将异常作为正常流程抛出并不是一个好主意,但我不确定是否是这种情况,因为如果我必须检查参数而且有ArgumentNullExceptionArgumentException之类的例外,当参数有问题时它似乎可以被抛出,它让我想知道它是否真的是一个糟糕的方法,我的例子评价。

另一个用户提供它的另一个原因是异常消耗4000-8000个CPU周期。好吧,在我的情况下,目标是知道参数是否有一些错误,并且如果应用程序按预期工作,则永远不会抛出异常,因此在实践中,如果应用程序没有错误,那么性能不会&# 39;减少。

总而言之,我想知道在继续这个过程之前如何处理参数检查的最佳方法。

感谢。

2 个答案:

答案 0 :(得分:2)

当必需值为null或缺失时,您肯定应该抛出异常。我想要清理这种情况的一件事是使用一种方法来检查Type是否有效,并在我的代码可能抛出异常时使用Exception注释。

缺点是,如果使用正确,Validate(...)方法将被调用两次。我喜欢Validate(...)方法,因为它允许更改在抛出异常之前找到错误,因为任何类都可以调用Validate(...)

class MyClass
{
    /// <summary>
    /// DoSomething
    /// </summary>
    /// <exception cref="InvalidOperationException">InvalidOperationException</exception>
    public void DoSomething(MyType myType)
    {
        string errorMessage;
        if (!Validate(myType, out errorMessage))
            throw new InvalidOperationException(string.Format("Argument myType is not valid: {0}", errorMessage));

        // Finish
    }
    /// <summary>
    /// IsValid
    /// </summary>
    /// <exception cref="ArgumentNullException">ArgumentNullException</exception>
    public static bool Validate(MyType myType, out string errorMessage)
    {
        errorMessage = null;

        if (myType == null)
            throw new ArgumentNullException("myType");           
        if (string.IsNullOrEmpty(myType.Property1))
            errorMessage = "Property1 is required";
        if (string.IsNullOrEmpty(myType.Property2))
            errorMessage = "Property2 is required";

        return errorMessage == null;
    }
}

class MyType
{
    public string Property1 { get; set; }

    public string Property2 { get; set; }
}

答案 1 :(得分:1)

在参数验证后抛出异常是一种很好的方法。通过这种方式,您明确地让开发人员使用您的方法知道他正在调用它,这使他能够轻松修复此错误。

但是,我肯定会摆脱try...catch部分。它绝对是多余的,使得代码比它需要的更复杂(并且有点令人困惑)。