我很喜欢使用Exception子类型来帮助描述导致异常的问题。例如,假设我正在编写一个不允许将大于100的int值作为参数传入的方法。我经常会用一个条件启动方法来防止这种情况,如果发生异常则抛出异常。我可能会抛出一个System.Argument异常(带有适当的消息,内部异常和数据)来表明这一点。
现在我有一个有两个属性的类。对于要被视为“有效”的对象,这些属性中的一个必须具有非null值,而另一个必须为null。我碰巧有一个缺陷情况,这不是真的,我想在检测到它时抛出异常。
我的问题是:在这种情况下使用的最佳Exception子类是什么?我没有看到(无效)StateException子类。 ApplicationException是明显的后备选择,但它非常通用,所以我希望有更好的东西。
我目前特别感兴趣的是.NET Exception子类,但由于同样的问题适用于多种语言,我不会认为其他语言解决方案的讨论过于偏离主题。例如:Java有IllegalStateException,它似乎完美地描述了我的需求。我也赞成similar question for Ruby。
答案 0 :(得分:3)
简单答案(关于主题):
如果我们纯粹是在谈论API滥用,而设计意味着这种情况是不可避免的,那么InvalidOperationException可能就是你所期待的。它通常在调用者做错的事情时使用,例如在对象处于有效状态时调用对象上的特定方法来处理调用。例如。在空堆栈上调用“pop”,或者在尚未调用其“Connect”方法的套接字上调用“Send”方法。
不那么简单回答(稍微偏离主题):
这取决于。想到的事情:
如果您可以避免出现这种情况或者在更早/在不同的地方检测到无效状态(例如,当设置了值时),那么更改设计可能会更好。
如果该类有错误并且该案例永远不会发生,那么在为其添加例外之前我会三思而后行。关于这种情况,我真的很喜欢Eric's answer to another question。
答案 1 :(得分:1)
我认为最接近开箱即用的例外是InvalidOperationException。
“方法调用对于对象的当前状态无效时抛出的异常”