【问题标题】:Exception Design InvalidParentException and ObjectAlreadyPresentException异常设计 InvalidParentException 和 ObjectAlreadyPresentException
【发布时间】:2011-08-08 11:32:47
【问题描述】:

我正在设计一个框架库,可用于存储分层链接的对象集。我需要决定以下方法可以抛出哪些异常:

class StoreSession {
  StoreLeaf(leaf, parent)
}

当用户调用 StoreLeaf() 传递参数时,如果叶没有根据我执行的一些自定义规则分层链接到父级,那么我需要抛出异常(类似于 InvalidParentException

如果我尝试存储的对象在存储库中已经有一个条目,那么我还需要抛出异常(类似于ObjectAlreadyPresentException

我提到了FDGhere,没有任何例外情况可以描述这两种情况。

是否有任何描述这些错误情况的 .NET 异常?或者即使我必须创建一个新的 Exception 类型,是否有任何特定的 .NET 异常可以从中派生?

【问题讨论】:

    标签: .net


    【解决方案1】:

    不,没有任何特定的 .NET Exception 描述这些条件;如果有,它们可能会特定于适合您需求的数据结构,而您将使用它而不是自己编写。

    也就是说,框架刚出来的时候,最初的建议是从ApplicationException派生出来的,但是很快发现导致相当臃肿并且无效,所以目前的做法是@987654322 @。

    但是,在您的具体情况下,除非您计划在面对这些例外情况时采取行动,否则您应该只使用InvalidOperationException

    如果您对这些异常执行操作,那么您可能需要考虑是否应该使用异常;将业务逻辑基于异常通常是不好的做法;您应该尽可能使用返回代码/值。

    【讨论】:

      【解决方案2】:

      这听起来不像是一个应该被捕获的异常。由于它代表客户端代码中的错误,因此 catch 处理程序无法重写代码。因此,为它们创建专用的异常类型没有什么意义,如果要捕获和处理异常,您必须这样做。

      带有良好异常消息的 InvalidOperationException 很好。

      【讨论】:

        【解决方案3】:

        在没有此类事情的指导方针的情况下,我倾向于尝试在 BCL 中为尽可能类似的事情找到一种方法。例如,IDictionary 实现是supposed to throw an ArgumentException for a duplicate key passed to the Add(TKey, TValue) method,这正是 Dictionary 实际所做的。在没有任何证据表明 BCL 作者对在这种情况下抛出 ArgumentException 的决定感到遗憾(例如注释 FDG 中的评论)的情况下,为了与现有 BCL 机制保持一致,我倾向于重用他们的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-02
          • 1970-01-01
          • 2021-08-13
          • 1970-01-01
          • 2023-03-05
          • 2012-09-22
          相关资源
          最近更新 更多