为什么.NET的StringValidator的Validate方法在不成功时抛出异常?

时间:2010-10-26 16:34:24

标签: .net exception coding-style

正如您在MSDN StringValidator documentation中看到的那样,Validate方法会返回void
如果验证失败,则Validate方法会抛出ArgumentException 我认为“只有在出现特殊情况时才会抛出异常” 当然,未能验证的验证器也不例外。
为什么不回归布尔?我在这里想念的是什么? 这是一个“风格问题”(即如果它返回bool,它仍然是正确的,但只是不同的风格)?

注意:方法CanValidate 可能与它有关,但我仍然认为没有理由这样做。

5 个答案:

答案 0 :(得分:2)

请参阅ArgumentException Class

您可以使用bool替换ArgumentExeption可能包含的信息吗? 并基于此页面,

  

ArgumentException:“异常   其中一个参数抛出   提供给方法无效。

因此,如果StringValidator.Validate(Object)中的参数“对象”无效,那么最佳选择应该是什么?返回各种对象或只抛出ArgumentException?

答案 1 :(得分:1)

我同意它应该返回一个布尔值,在许多现实世界的应用程序中,验证失败并不例外。

答案 2 :(得分:1)

答案 3 :(得分:0)

在某些情况下,应用程序的架构可能会导致验证在调用此代码时失败,这将是一个“异常事件”;调用代码只是想做一个,最后快速仔细检查,只是“假设一切正常” - 但是如果发生意外情况导致值失败验证仍然能够得到通知。

我会说这些案件可能不常见,但是......

答案 4 :(得分:0)

StringValidator以及从ConfigurationValidatorBase派生的任何类型都打算与.NET配置系统一起使用(有关其功能的详细概述,请参阅Jon Rista的article)。一个简单的用例如下:

public class MyConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("ConfigurationText", IsRequired=true)]
    [StringValidator(0, 10)]
    public string Text { get; set; }  // implementation removed for brevity
}

在这种情况下,StringValidatorAttribute在内部实例化StringValidator,它来自ConfigurationValidatorBase。因此,任何类型的ConfigurationValidatorBase都可以与配置属性一起使用(假定属性的类型和验证匹配的内容),因此我认为配置系统需要与此抽象交互。

如果ConfigurationValidatorBase的验证方法总是返回一个布尔值,那么对于任何类型的验证,如何确定任何属性的具体验证错误是什么?我确定该类型可以设计为返回字符串和布尔值,但是由于需要解析字符串(即导致长度验证错误的值),因此很难从错误中获取其他信息。

使用异常似乎是一个很好的缓解解决方案,而不会给系统带来额外的复杂性。