c# - 当 Argument 的内部无效时抛出异常
问题描述
我已经问过自己很多次了,但直到今天我还没有找到一个好的答案。如果您意识到传递给您的方法的参数中存在无效状态,那么抛出的正确异常是什么,例如,如果我需要确保在参数内设置了某个字段。看看下面的例子:
public void DoSomethingElse(SomeObject parameter)
{
if (parameter.Field is null)
{
throw new ArgumentNullException(); // what to throw here?
}
}
我应该在这里抛出什么样的异常?它不是ArgumentNullException
,因为 Argument 不是 null,而是字段。FxCop 还为您提供 CA2208。我在考虑NotSupportedException
or InvalidOperationException
,但两者都主要用于其他用例并且不合适。我通常倾向于抛出一个 plain ArgumentException
,但它不像 ArgumentNullException 那样具有描述性,因此我必须在异常消息中提供更有意义的解释。
另一个例子是下面的 switch 语句。
public void DoSomething(SomeObject parameter)
{
switch(parameter.SomeEnum)
{
case SomeEnum.Value1:
// Do Something
break;
case SomeEnum.Value2:
// Do Something
break;
default:
throw new ArgumentOutOfRangeException(); // what to throw here?
}
}
同样,参数本身并没有超出范围,而是它的域。同样,ArgumentOutOfRangeException 是最好的匹配,但它仍然不是参数,这是一个问题。在 switch 的情况下,IndexOutOfRangeException
乍一看似乎很合适,但我们没有使用索引。因此,我再次退回到ArgumentException
并觉得有必要在异常消息中描述问题。
所以我的问题是,处理上述情况的最佳方法是什么,不是论点本身而是其内容处于无效状态?
解决方案
我认为这是您使用异常参数提供额外细节的地方。
if (parameter.Field is null)
{
throw new ArgumentException("Field is null", "parameter"); // what to throw here?
}
或者更改函数以仅采用该参数,而不是整个对象。那么 ArgumentNullException 将是合适的。