【问题标题】:Exception subclass for Bad Object State?错误对象状态的异常子类?
【发布时间】:2009-12-17 22:45:46
【问题描述】:

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

现在我有一个有两个属性的类。对于被视为“有效”的对象,这些属性中的一个必须具有非空值,而另一个必须为空。我碰巧有一个不正确的缺陷案例,我想在检测到这一点时抛出异常。

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

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

【问题讨论】:

    标签: .net exception


    【解决方案1】:

    简单答案(关于主题):

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

    不是那么简单的答案(稍微偏离主题):

    这取决于。想到的事情:

    • 您的课程是否被滥用 来电者还是被窃听了?
    • 能否更改 API 以避免 情况完全?
    • 能否添加验证 其他步骤来检测 发生的情况?

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

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

    【讨论】:

    • +1 - 文档甚至说当方法调用对于对象的当前状态无效时引发的异常。
    • 更改 API:不,因为它是 LINQ 生成的类;否则这绝对是我的首选路线。
    • 听起来很熟悉。前几天我在嘲笑类似的事情:)
    • 仅供参考,我现在正在实施 LINQ 的 OnValidate 以帮助防止这种情况发生。不幸的是,“坏”数据已经在数据库中,所以这不会完全使检查变得不必要。这就是生活。
    【解决方案2】:

    我认为最接近的开箱即用异常是 InvalidOperationException。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2014-08-28
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多