如果我有所有可能枚举类型的案例,我应该在NotImplementedException()
上抛出default
吗?
答案 0 :(得分:13)
如果您正在寻找必须的值,根据定义,它对应于枚举的值,并且您已收到其他内容,那肯定是无效的参数。
但现在你必须考虑上下文。
该方法是私有的,只能由类库或应用程序的成员访问吗?如果是,那就是编码错误,首先不应该发生。断言并失败。
另一方面,如果它是一个公共或受保护的方法,并且可以被使用您的库的客户端访问,那么您肯定应该使用有意义的消息(最好是一个众所周知的异常类型)。
重要的是要记住,框架中的枚举不是范围检查。我可以指定一个方法需要一个Environment.SpecialFolder类型的参数;但它将接受任何 32位整数值。
因此,简而言之,如果您的方法是供公众使用,是,请务必投掷。如果不是公共消费,Assert。
答案 1 :(得分:5)
这真的取决于。
NotImplementedException对我来说就像todo mark。这意味着有人会在稍后完成代码。但是,我认为不应该发生默认情况。
当您检查对象的状态时,您可以考虑InvalidOperationException。您的方法仅适用于现有案例。
当您区分输入参数ArgumentException时,总是合适。
在其他情况下,我更喜欢NotSupportedException。它略微表明平台或版本出了问题。并且当不应该发生切换的默认情况时,代码的不兼容版本是问题的真正根源。
答案 2 :(得分:4)
可能不是NotImplementedException,但是ArgumentException。这实际上取决于你在哪里使用它。
答案 3 :(得分:2)
这听起来像是一个合理的选择。
就个人而言,我会创建一种新类型的异常(可能是InvalidEnumException
或者给它一个对支持团队有意义的另一个名称)然后抛出它。
答案 4 :(得分:1)
我会抛出ApplicationException
因为如果你的代码达到默认值并且你没有预料到这意味着你的代码中的某些东西不像你想的那样表现。
答案 5 :(得分:1)
这实际上取决于您的使用案例。如果您在集成的早期阶段抛出异常将会很有帮助。您图书馆的用户可以立即了解错误
答案 6 :(得分:0)
这实际上取决于具体的过程,但是,在默认情况下回复是一个很好的过程:如果某些东西不应该出现在那里。
答案 7 :(得分:0)
我要说至少你应该放Debug.Fail()
。
如果方法无法继续,则应抛出异常。但是,如果您想将枚举值转换为字符串表示形式,那么您只需返回一些警告字符串即可。由于明显的错误,产品不会在用户身上崩溃,可能会有解决方法,每个人都会很开心。
答案 8 :(得分:0)
如果你抛出异常将会发生什么?在什么上下文中执行switch语句?这种情况应该发生吗?它应该在生产代码中的运行时发生吗?您的单元测试是否涵盖了这种情况?如果是这样,也许断言会更好。
答案 9 :(得分:0)
如果您在已知案例之外得到一个值,您应首先考虑它意味着什么 - 接通的变量代表什么?然后,您可以简单地使用适合实际情况的异常类型。