抛出未处理的开关盒的正确例外是什么?
可能重复:
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);