坏对象状态的异常子类?

时间:2009-12-17 22:45:46

标签: .net exception

我很喜欢使用Exception子类型来帮助描述导致异常的问题。例如,假设我正在编写一个不允许将大于100的int值作为参数传入的方法。我经常会用一个条件启动方法来防止这种情况,如果发生异常则抛出异常。我可能会抛出一个System.Argument异常(带有适当的消息,内部异常和数据)来表明这一点。

现在我有一个有两个属性的类。对于要被视为“有效”的对象,这些属性中的一个必须具有非null值,而另一个必须为null。我碰巧有一个缺陷情况,这不是真的,我想在检测到它时抛出异常。

我的问题是:在这种情况下使用的最佳Exception子类是什么?我没有看到(无效)StateException子类。 ApplicationException是明显的后备选择,但它非常通用,所以我希望有更好的东西。

我目前特别感兴趣的是.NET Exception子类,但由于同样的问题适用于多种语言,我不会认为其他语言解决方案的讨论过于偏离主题。例如:Java有IllegalStateException,它似乎完美地描述了我的需求。我也赞成similar question for Ruby

2 个答案:

答案 0 :(得分:3)

简单答案(关于主题):

如果我们纯粹是在谈论API滥用,而设计意味着这种情况是不可避免的,那么InvalidOperationException可能就是你所期待的。它通常在调用者做错的事情时使用,例如在对象处于有效状态时调用对象上的特定方法来处理调用。例如。在空堆栈上调用“pop”,或者在尚未调用其“Connect”方法的套接字上调用“Send”方法。

不那么简单回答(稍微偏离主题):

这取决于。想到的事情:

  • 你的班级被误用了吗? 来电者还是被窃听?
  • 您可以更改API以避免使用 情况完全?
  • 您可以添加验证吗? 在其他地方检测的步骤 条件发生了吗?

如果您可以避免出现这种情况或者在更早/在不同的地方检测到无效状态(例如,当设置了值时),那么更改设计可能会更好。

如果该类有错误并且该案例永远不会发生,那么在为其添加例外之前我会三思而后行。关于这种情况,我真的很喜欢Eric's answer to another question

答案 1 :(得分:1)

我认为最接近开箱即用的例外是InvalidOperationException。

“方法调用对于对象的当前状态无效时抛出的异常”