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

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

假设我们有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()); } } 

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

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

在这个实例中, ArgumentException对我来说是最正确的(尽管在BCL中没有定义)。

枚举参数有一个特殊的例外–InvalidEnumArgumentException :

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

另一种方法是ArgumentOutOfRangeException :

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

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

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

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

无效参数传递给引用的服务器连接上的方法时引发的exception。

编辑:一个更好的选择是: ArgumentException ,因为Microsoft.SqlServer.Management.Common命名空间中的InvalidArgumentException 。 就像是:

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

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

如果您使用的是代码约定(我强烈推荐的话),您可以将其放在方法的开头:

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

如果要检查具有太多单个值的枚举范围以明确地将它们全部写入,则可以这样执行:

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