首页 > 解决方案 > 当 Argument 的内部无效时抛出异常

问题描述

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

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

我应该在这里抛出什么样的异常?它不是ArgumentNullException,因为 Argument 不是 null,而是字段。FxCop 还为您提供 CA2208。我在考虑NotSupportedExceptionor 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并觉得有必要在异常消息中描述问题。

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

标签: c#exceptionargumentexceptionargumentnullexception

解决方案


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

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

或者更改函数以仅采用该参数,而不是整个对象。那么 ArgumentNullException 将是合适的。


推荐阅读