C# 在switch语句的默认情况下引发NotImplementedException

C# 在switch语句的默认情况下引发NotImplementedException,c#,exception,switch-statement,C#,Exception,Switch Statement,如果所有可能的枚举类型都有实例,我是否应该在默认值上抛出NotImplementedException() 就我个人而言,我会创建一种新类型的异常(可能是InvalidEnumException,或者给它起另一个对支持团队有意义的名字)然后抛出它。我会抛出ApplicationException,因为如果您的代码达到默认值,而您没有预料到这一点,这意味着代码中的某些内容与您的想法不符。我想说,至少您应该在那里放置一个Debug.Fail() 如果方法无法继续,您应该抛出异常。但是,如果您想将枚举

如果所有可能的枚举类型都有实例,我是否应该在
默认值上抛出
NotImplementedException()


就我个人而言,我会创建一种新类型的异常(可能是
InvalidEnumException
,或者给它起另一个对支持团队有意义的名字)然后抛出它。

我会抛出
ApplicationException
,因为如果您的代码达到默认值,而您没有预料到这一点,这意味着代码中的某些内容与您的想法不符。

我想说,至少您应该在那里放置一个
Debug.Fail()


如果方法无法继续,您应该抛出异常。但是,如果您想将枚举值转换为字符串表示形式,则可以只返回一些警告字符串。产品不会因为明显的错误而在用户身上崩溃,可能会有解决办法,每个人都会很高兴。

可能不是实现了例外,而是ArgumentException。这实际上取决于您在哪里使用它。

这实际上取决于您的用例。如果您在集成的早期抛出异常,这将非常有用。库的用户可以立即知道错误

如果抛出异常,会发生什么?switch语句是在什么上下文中执行的?这种情况会发生吗?它是否应该在生产代码的运行时发生?您的单元测试是否涵盖了这种情况?如果是这样,也许一个断言会更好。

你应该首先考虑如果你在已知的情况之外得到一个值意味着什么——被切换的变量代表什么?然后,您可以简单地使用符合实际情况的异常类型

如果您正在查找一个值,根据定义,该值必须与枚举的值相对应,并且您收到了其他内容,那么这肯定是一个无效参数

<> P>但是现在你必须考虑上下文。

该方法是私有的,并且只能由类库或应用程序的成员访问吗?如果是的话,这是一个编码错误,本来就不应该发生。断言并失败

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

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

所以,简而言之,如果你的方法是为了公众消费,是的,无论如何,扔掉它。如果不是为了公众消费,那就要看情况了

  • 这对我来说有点像是要做的事。这意味着稍后会有人来完成代码。然而,我不认为这是不应该发生的违约案例

  • >P>当你正在检查对象的状态时,你可以考虑。您的方法仅设计用于处理现有案例

  • 当你们区分输入参数时,它总是合适的

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


我想这取决于你的应用程序,以及如果你的值超出范围会发生什么。我个人会尝试重用现有的无数异常类型之一。同意,投了否决票,因为我认为这不是自定义异常类型的情况。如果意外值来自您自己的,则断言并失败。另一方面,如果它来自使用你的代码的其他人,那么你应该抛出一个异常,并给调用代码一个恢复的机会。为什么断言比抛出更好?可能这种情况很少见,开发人员没有遇到,只有测试人员遇到,他们使用发布版本(没有编译断言),错误被吞没。如果你不为其他公司编写API,那么在代码中加入多少错误检查是值得的?另一个问题是,如果你不为其他公司编写API,那么在代码中加入多少错误检查是值得的?我认为短代码比由于错误检查而使每个方法的大小加倍的代码更可读。是吗?@csuporj-关于你的第一个问题,如果你真的很担心晦涩难懂的bug,那就用Fail吧。一个模糊不清的bug无论如何都会溜过去。我们可以希望通过彻底的单元测试和预先的QA测试来缓解这些情况,但现代的无缺陷软件是不存在的。@csuporj-关于第二个问题,错误检查和交换机结构中的默认情况并不完全相同。他必须根据枚举的值做一些具体的事情。如果它不是枚举的已知值之一,他应该怎么做?打电话的人会有所期待。如果参数类型指定了枚举值,则除此之外的任何内容都违反了方法的约定。未能确保这一点会引出您的第一个问题。ApplicationException的使用是否不受欢迎?有趣的答案。你的动机/理由是什么?回答得很好,谢谢更新。我完全同意你的说法。这有助于我在自己的头脑中理直气壮。