【发布时间】:2012-11-18 16:04:28
【问题描述】:
这是我的other question about unhandled cases with enums 的另一个案例,建议我将其作为一个单独的问题提出。
假设我们有 SomeEnum 并有一个 switch 语句来处理它:
enum SomeEnum
{
One,
Two
}
void someFunc()
{
SomeEnum value = someOtherFunc();
switch(value)
{
case One:
... break;
case Two:
... break;
default:
throw new ??????Exception("Unhandled value: " + value.ToString());
}
}
如您所见,我们处理所有可能的枚举值,但仍保留默认值,以防添加新成员时抛出异常,并且我们希望确保我们知道丢失的处理。
我的问题是:在您想要通知给定代码路径未处理/实现或不应该访问的情况下,正确的例外是什么?我们曾经使用NotImplementedException,但它似乎并不合适。我们的下一个候选人是InvalidOperationException,但这个词听起来不太对。什么是正确的,为什么?
【问题讨论】:
-
GivenCodePathIsNotHandledException -
@AmithGeorge:但这不是争论?
-
看起来
someOtherFunc行为不端并返回无效枚举。someOtherFunc不应该是抛出异常的函数吗?它会更好地了解为什么会生成无效值。 -
@AmithGeorge:将它们视为由不同开发人员开发的两个独立组件。开发人员 B 添加了一个新的枚举返回值,但开发人员 A 不知道。在这种情况下,A 的代码会默默地忽略新的枚举值,并可能会产生难以检测的问题。例外可以避免这种情况。
-
是的。鉴于此,
someFunc不是NotSupported的情况吗?虽然我想知道当someFunc仅适用于这两个值时会发生什么。在添加第三个枚举值不会影响someFunc的操作的情况下。在这些情况下,它仍然会抛出异常。要处理这些,您需要添加空案例处理程序。