我已经问过自己很多次了,但是直到今天,我还没有找到一个好的答案。如果您意识到传递给您的方法的参数中存在无效状态,则抛出正确的异常是什么,例如如果我需要确保在参数内设置了某个字段。看下面的例子:
public void DoSomethingElse(SomeObject parameter)
{
if (parameter.Field is null)
{
throw new ArgumentNullException(); // what to throw here?
}
}
我应该在这里抛出哪种异常?它不是ArgumentNullException
,因为参数不是null,而是字段。 FxCop还为您提供了CA2208。我当时在考虑NotSupportedException
或InvalidOperationException
,但两者都主要用于其他用例,并不适合。我通常倾向于抛出一个简单的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是最匹配的,但它仍然不是参数,这是一个问题。对于切换,IndexOutOfRangeException
乍一看似乎很合适,但是我们没有使用索引。因此,我再次回到ArgumentException
并感到有必要在异常消息中描述问题。
所以我的问题是,处理上述情况的最佳方法是什么,不是参数本身而是参数内容处于无效状态?
答案 0 :(得分:1)
我认为这是您使用异常参数提供更多细节的地方。
if (parameter.Field is null)
{
throw new ArgumentException("Field is null", "parameter"); // what to throw here?
}
或将函数更改为仅采用该参数,而不采用整个对象。那么ArgumentNullException就合适了。