为什么.NET';StringValidator';s Validate方法在不执行时引发异常';你不会成功吗?
如中所示,为什么.NET';StringValidator';s Validate方法在不执行时引发异常';你不会成功吗?,.net,exception,coding-style,.net,Exception,Coding Style,如中所示,Validate方法返回void 如果验证未成功,Validate方法将抛出ArgumentException 我认为“只有在发生异常情况时才抛出异常”。 验证失败的验证器肯定不是例外。 为什么不返回布尔?我错过了什么? 这是一个“风格问题”(即,如果它返回bool,它仍然是正确的,但只是不同的风格) 注意:方法可能与此有关,但我仍然看不出这种行为的原因。我同意它应该返回布尔值,在许多实际应用程序中,验证失败并不例外。在某些情况下,应用程序的架构可能会导致在调用此代码时验证失败的“例外
Validate
方法返回void
如果验证未成功,
Validate
方法将抛出ArgumentException
我认为“只有在发生异常情况时才抛出异常”。
验证失败的验证器肯定不是例外。
为什么不返回布尔?我错过了什么?
这是一个“风格问题”(即,如果它返回bool,它仍然是正确的,但只是不同的风格)
注意:方法可能与此有关,但我仍然看不出这种行为的原因。我同意它应该返回布尔值,在许多实际应用程序中,验证失败并不例外。在某些情况下,应用程序的架构可能会导致在调用此代码时验证失败的“例外事件”;如果调用代码只想执行一次,则快速进行最后一次双重检查并“假设一切正常”——但如果发生意外情况导致值验证失败,仍然能够收到通知 我想说这些病例可能不常见,但是…请参见 你能用bool替换ArgumentException可能包含的信息吗? 根据这一页, ArgumentException:“例外 当其中一个参数 提供给方法的值无效
因此,如果
StringValidator.Validate(Object)中的参数“Object”
无效,最好的选择是什么?返回各种对象或仅抛出ArgumentException?StringValidator
,以及从ConfigurationValidatorBase
派生的任何类型都将用于.NET配置系统(有关其功能的详细概述,请参阅Jon Rista's)。一个简单的用例如下所示:
public class MyConfigurationSection : ConfigurationSection
{
[ConfigurationProperty("ConfigurationText", IsRequired=true)]
[StringValidator(0, 10)]
public string Text { get; set; } // implementation removed for brevity
}
在这种情况下,StringValidator属性
在内部实例化一个StringValidator
,它派生自ConfigurationValidatorBase
。因此,任何类型的ConfigurationValidatorBase
都可以与配置属性一起使用(假定属性的类型和验证的匹配),因此我相信配置系统需要与这个抽象交互
如果ConfigurationValidatorBase
的验证方法始终返回布尔值,那么如何确定任何属性、任何类型的验证的具体验证错误是什么?我确信该类型可能被设计为同时返回字符串和布尔值,但这样就很难获得附加值l需要解析来自错误的信息,如字符串(即导致长度验证错误的值)
在不增加系统复杂性的情况下,使用异常似乎是一个很好的缓解方案。你说得对: 注意:方法CanValidate可能与此有关 在这两者之间,此代码的用户可以接收对验证检查的非异常响应,也可以触发异常。这两个选项都存在表明类的设计者至少可以看到每种方法的一些合理情况。假设他们的设计不完全是愚蠢的(或者即使没有这种假设,因为它适用于别处),让我们考虑两种情况都有意义的。< /P>
让我们考虑一个方法:代码>静态MySettings ReadSettings(String FielPATH)。该方法将从文件的内容中获得某种有意义的对象。,而不依赖于BCL中的文件操作类;这不是因为这是一个好主意,而是因为它将异常处理的所有问题都带到了我们必须处理的领域中(实际上,我们可以通过允许BCL文件相关的方法返回一个可用的流,或者抛出几个可能的异常,而将我们一起考虑的几个例外,但是我们想考虑一下这些可能性。) 可能出错的事情有:
文件路径
无效让我们考虑使用代码在这种情况下会做什么。这将是非常罕见的,所以可能使用代码将无法检查它(您可能认为这是不完美的,但假设调用代码中的完善是对代码的糟糕设计)。(例如,如果调用代码靠近用户界面,则可以向用户发送消息进行响应),但可能是