当参数内部无效时引发的异常

时间:2018-11-09 14:06:25

标签: c# exception argumentexception argumentnullexception

我已经问过自己很多次了,但是直到今天,我还没有找到一个好的答案。如果您意识到传递给您的方法的参数中存在无效状态,则抛出正确的异常是什么,例如如果我需要确保在参数内设置了某个字段。看下面的例子:

public void DoSomethingElse(SomeObject parameter) 
{
    if (parameter.Field is null)
    {
        throw new ArgumentNullException(); // what to throw here?
    }
}

我应该在这里抛出哪种异常?它不是ArgumentNullException,因为参数不是null,而是字段。 FxCop还为您提供了CA2208。我当时在考虑NotSupportedExceptionInvalidOperationException,但两者都主要用于其他用例,并不适合。我通常倾向于抛出一个简单的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并感到有必要在异常消息中描述问题。

所以我的问题是,处理上述情况的最佳方法是什么,不是参数本身而是参数内容处于无效状态?

1 个答案:

答案 0 :(得分:1)

我认为这是您使用异常参数提供更多细节的地方。

if (parameter.Field is null)
{
    throw new ArgumentException("Field is null", "parameter"); // what to throw here?
}

或将函数更改为仅采用该参数,而不采用整个对象。那么ArgumentNullException就合适了。