Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么.NET';StringValidator';s Validate方法在不执行时引发异常';你不会成功吗?_.net_Exception_Coding Style - Fatal编程技术网

为什么.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文件相关的方法返回一个可用的流,或者抛出几个可能的异常,而将我们一起考虑的几个例外,但是我们想考虑一下这些可能性。) 可能出错的事情有:

  • 文件路径
    无效
  • 该文件不存在,或者由于其他原因无法打开
  • 该文件不包含适当的数据
  • 出于安全原因,我们尝试打开操作系统限制访问的文件
  • 我们尝试打开一个操作系统不限制访问的文件(它不属于一般安全规则),但打开它将是一个安全隐患(例如,根据我们的应用程序规则,它属于不同的“用户”,但不属于操作系统规则)
  • 文件操作中途中断(例如磁盘错误)
  • 发生了我们尚未考虑的意外错误
  • 发生了意外的安全错误,我们无法捕获,因为我们没有考虑它(本质上,代码中存在安全漏洞)
  • 值得注意的是,7和8不是我们显式编码的情况;从本质上讲,它们是我们没有想过要编码的东西

    现在,有些情况是不可能完全避免的;例如,即使我们检查文件是否存在,它也会引入竞争条件(可以在事后删除),并且不会在读取文件的过程中排除磁盘错误

    让我们考虑使用代码在这种情况下会做什么。这将是非常罕见的,所以可能使用代码将无法检查它(您可能认为这是不完美的,但假设调用代码中的完善是对代码的糟糕设计)。(例如,如果调用代码靠近用户界面,则可以向用户发送消息进行响应),但可能是