可能重复:
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
,但这个词听起来不对。什么是正确的,为什么?
答案 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);