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

Sed*_*glu 10 .net c# exception

可能重复:
C#:当没有指定的大小写可以处理时,在switch语句中抛出异常

假设我们有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());    
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ode*_*ded 18

ArgumentException 在这个例子中看起来对我来说最正确(虽然没有在BCL中定义).

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

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

另一种方法是ArgumentOutOfRangeException:

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

使用它们的逻辑是传入的参数(value)无论如何都是无效的someFunc.

  • 你的意思是[`ArgumentException`](http://msdn.microsoft.com/en-us/library/system.argumentexception.aspx)?[`InvalidArgumentException`](http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.common.invalidargumentexception.aspx)适用于Sql-Server. (2认同)
  • InvalidArgumentException位于Microsoft.SqlServer.Management.Common命名空间中,几乎不适用于一般情况 - 特别是因为它派生自ConnectionException (2认同)

CR4*_*G14 11

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