抛出未处理的开关盒的正确例外是什么?

时间:2012-11-30 11:53:34

标签: c# .net exception

  

可能重复:
  C#: Throwing exceptions in switch statements when no specified case can be handled

假设我们有SomeEnum并且有一个switch语句处理它,如:

enum SomeEnum
{
  One,
  Two
}

void someFunc(SomeEnum value)
{
  switch(value)
  {
     case One:
       ... break;
     case Two:
       ... break;
     default:
         throw new ??????Exception("Unhandled value: " + value.ToString());    
  }
}

如您所见,我们处理所有可能的枚举值但仍保留默认值,以防添加新成员,并且我们希望确保我们知道丢失的处理。

我的问题是:在您想要通知未处理/实施给定代码路径或应该从未访问过的情况下,什么是正确的异常?我们曾经使用NotImplementedException,但它似乎不合适。我们的下一位候选人是InvalidOperationException,但这个词听起来不对。什么是正确的,为什么?

5 个答案:

答案 0 :(得分:16)

在这个例子中,

ArgumentException看起来最正确(虽然在BCL中没有定义)。

枚举参数有一个专门的例外 - InvalidEnumArgumentException

  

使用作为枚举数的无效参数时抛出的异常。

另一种选择是ArgumentOutOfRangeException

  

当参数的值超出被调用方法定义的允许值范围时抛出的异常。

使用这些的逻辑是,就value而言,传入的参数(someFunc)无效。

答案 1 :(得分:10)

我会抛出InvalidEnumArgumentException,因为在这种情况下它会提供更详细的信息,你正在检查枚举

答案 2 :(得分:3)

由于您已在函数中登录,因此可以抛出InvalidArgumentException

  

当一个无效的参数是时引发的异常   传递给引用服务器连接的方法

修改 一个更好的选择是:ArgumentException,因为InvalidArgumentException命名空间中的Microsoft.SqlServer.Management.Common。类似的东西:

throw new ArgumentException("Unhandled value: " + value.ToString());

答案 3 :(得分:0)

InvalidArgumentException。 当用户在需要值时传递一些无效值或空值时,建议处理InvalidArgumentException。

答案 4 :(得分:0)

如果您使用的是代码合同(我 HIGHLY 推荐的内容),您可以将其放在方法的开头:

Contract.Requires(value == SomeEnum.One || value == SomeEnum.Two);

如果你想检查具有太多单个值的枚举范围以明确地写出它们,你可以这样做:

Contract.Requires(SomeEnum.One <= value && value <= SomeEnum.Two);