返回一个不知道的异常是验证输入的错误做法吗?

时间:2012-03-16 05:22:17

标签: .net exception-handling

为了输入验证的目的,编写返回未经抛出的异常的方法是不是一种坏习惯?如果输入有效,Validate方法将返回null,或者如果实际提交输入,则返回将抛出的异常。

public Exception Validate(object input)
{
    if (!SomeParametersMatch(input))
        return new SomeException("Message...");
    if (!SomeOtherParametersMatch(input))
        return new SomeOtherException("Another message...");

    // More cases here...

    return null;
}

这样,您可以使用相同的功能验证输入,显示对用户的响应,并在代码中抛出异常:

public void Submit(object input)
{
    Exception ex = Validate(input);
    if (ex != null) throw ex;

    // Do whatever action here...
}

例如,如果您使用这些函数来标记有效单击的空格,则可以为每个空格调用Validate,如果返回值不为空,则将它们标记为有效。然后,只有在用户实际点击某个空格并完成选择后,才会调用Submit。如果您需要确保输入有效,则会删除代码重复。

我可以让Validate返回空格并简单地抛出异常,但由于catching thrown exceptions is the most part of exception throwingValidate将在更多无效输入上运行有效的投入,似乎是浪费。如果仅在用户实际提交数据时使用Validate,那么使用try / catch块就没有问题。但由于它被用于过滤呈现给用户的数据,因此在大多数情况下抛出异常,只是为了捕获并丢弃它,看起来非常浪费。

2 个答案:

答案 0 :(得分:1)

在哪里说try-catch块价格昂贵?返回异常有什么好处让其他人抛出它?

public void Validate(object input)
{
    if (!SomeParametersMatch(input))
        throw new Exception("Message...");
    if (!SomeOtherParametersMatch(input))
        throw new Exception("Another message...");

    // More cases here...

}

public void Submit(object input)
{
    Validate(input);

    // Do whatever action here...
}

此代码更具可读性且不那么令人困惑。这正是如何使用异常的原因。使用try-catch块的任何费用都是可以忽略不计的。

答案 1 :(得分:0)

DataAnnotations等验证库是一种解决方法,而不是处理用户输入验证的正确方法。最好的方法是从设置的每个属性中验证值。

DataAnnotations和相应的验证库具有副作用,即在验证对象之前所有对象都处于不一致状态。属性设置器内的验证没有同样的问题。

但是,有时候使用这样的库是最好的方法。 但不是每次都。确保它是正确的设计选择。

说完了,我会在验证方法中建立一个验证错误列表,然后抛出一个异常,包括所有错误。