考虑以下情况:
方法需要将两个索引确定为参数,其中一个索引等于或大于另一个索引,使有效范围相互依赖。
例如,获取数组子副本的方法,包括开始和结束索引:
public static T[] Sub<T>(this T[] @this, int start, int end) {
//Somewhere within...
var newLength = end - start;
if (newLength < 0)
//Throw exception because end<start...
}
现在,这是(诚然有点无关紧要,但仍然很有趣[恕我直言])问题:
ArgumentOutOfRangeException
定义为:
参数值超出时抛出的异常 允许的值范围由调用方法定义。
哪种情况适合这种情况,并且有点没有:
A
和{之间的关系{1}};不完全有效范围 B
和A
... B
的有效范围由B
定义;不是(明确地)通过该方法。另一方面,A
定义为:
当其中一个参数提供给a时抛出的异常 方法无效。
考虑到我关于ArgumentException
的有效范围如何由B
定义的论点,实际上非常合适:
A
小于B
时,无效。然而,异常(无论哪个)仍然基于索引,并且如果索引...直接绑定到有效或无效的范围
因此...
是否应抛出更一般的A
,因为它是使它们无效的索引组合?
是否应抛出更具体的ArgumentException
,即使&#34;无效&#34; 此处并不是(?)相当是否符合例外的预期用途?
或者应该抛出ArgumentOutOfRangeException
?
答案 0 :(得分:3)
我和ArgumentOutOfRangeException
一起去。这符合框架中其他地方的其他示例:
string.Substring(int, int)
会引发AOORE
。&#34; Array.Copy(Array, int, Array, int, int)
会引发AOORE
。&#34 ; DateTime(int, int, int)
会引发AOORE
。&# 34; 另一方面,我也应该提供反例:
Stream.Read(byte[], int, int)
抛出ArgumentException
。&#34; 我不确定为什么最后一个是这样定义的,但是我可以合理地说明这个方法来定义有效值的范围其他参数的术语和对象的状态。我个人会尝试用之前的参数来定义特定参数的有效值范围 - 所以如果你Foo(int x, int y)
要求x < y
,那么我和#39; d说y
的有效范围是根据x
定义的。