正如您在MSDN StringValidator documentation中看到的那样,Validate
方法会返回void
。
如果验证失败,则Validate
方法会抛出ArgumentException
我认为“只有在出现特殊情况时才会抛出异常”
当然,未能验证的验证器也不例外。
为什么不回归布尔?我在这里想念的是什么?
这是一个“风格问题”(即如果它返回bool,它仍然是正确的,但只是不同的风格)?
注意:方法CanValidate 可能与它有关,但我仍然认为没有理由这样做。
答案 0 :(得分:2)
您可以使用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
的验证方法总是返回一个布尔值,那么对于任何类型的验证,如何确定任何属性的具体验证错误是什么?我确定该类型可以设计为返回字符串和布尔值,但是由于需要解析字符串(即导致长度验证错误的值),因此很难从错误中获取其他信息。
使用异常似乎是一个很好的缓解解决方案,而不会给系统带来额外的复杂性。