在switch语句中的默认情况下抛出NotImplementedException

Jam*_*ead 10 c# exception switch-statement

我应该抛出一个NotImplementedException()default,如果我对所有可能的枚举类型的案件?

Mik*_*fer 13

如果你正在寻找一个值,根据定义,它必须对应于枚举的值,并且你已经收到了其他东西,那肯定是一个无效的参数.

但现在你必须考虑上下文.

方法是私有的,只能由类库或应用程序的成员访问吗?如果是,那就是编码错误,首先不应该发生.断言并失败.

另一方面,如果它是一个公共或受保护的方法,并且可以被使用您的库的客户端访问,那么您应该使用有意义的消息(最好是一个众所周知的异常类型).

重要的是要记住,在框架中没有对枚举进行范围检查.我可以指定一个方法需要一个Environment.SpecialFolder类型的参数; 但它会接受任何 32位整数值.

所以,简而言之,如果你的方法是公共消费,是的,无论如何,扔掉.如果不是为了公共消费,请断言.

  • 为什么Assert比投掷更好?也许这种情况是一种罕见的情况,并且开发人员没有点击它,并且它只受到测试人员的攻击,他使用Release版本(没有编译Assert)并且错误被吞没.是不是更好地吞下错误,不要崩溃但是难以调试不正确的东西,而不是崩溃堆栈跟踪? (2认同)

Jak*_*urc 5

这真的取决于.

  • NotImplementedException是一样的东西待办事项标记为我.这意味着有人会在稍后完成代码.但是,我不认为这种情况不应该发生.

  • 在检查对象的状态时,可以考虑InvalidOperationException.您的方法仅适用于现有案例.

  • 当您区分输入参数时,ArgumentException始终是合适的.

  • 在其他情况下,我更喜欢NotSupportedException.它略微表明平台或版本出了问题.并且当不应该发生的默认情况切换时,代码的不兼容版本是问题的真正根源.