【问题标题】:What exception should be thrown for an invalid ID?无效 ID 应该抛出什么异常?
【发布时间】:2015-05-12 07:34:19
【问题描述】:

我正在构建一个应用程序服务层,我的一个方法接受实体的 ID(整数)并返回引用的实体。虽然看起来应该很简单,但查看过多的 .NET 异常,我不完全确定如果找不到具有给定 ID 的实体应该抛出什么异常(我不想只返回 null) .

ObjectNotFoundException,但它位于 System.Data 命名空间中,这意味着它应该是特定于 ASP.NET 的,但事实并非如此。有NullReferenceException,但建议程序员不要抛出它,因为它是“内部的”,而且我不确定在这种情况下它是否完全正确。我不想抛出通用的Exception。那么,在这里抛出什么特定的异常类最有意义呢?由于这是一个应用服务层方法(因此非常抽象),我是否将自己限制在 System.SystemException 命名空间中的异常和/或自定义异常中是个好主意?

【问题讨论】:

标签: c# asp.net .net exception error-handling


【解决方案1】:

ArgumentOutOfRangeException - 用户提供了错误的 ID 不是方法的错(正如所有例外情况所暗示的那样)。

ArgumentException 不那么冗长。

【讨论】:

    【解决方案2】:

    您可以创建自己的异常并抛出它,例如 InvalidEntityIdProvidedException。

    class InvalidEntityIdProvidedException : Exception { }
    

    然后这样称呼它:

    if ( entityId < 0 ) {
        throw new InvalidEntityIdProvidedException("The entity id provided is incorrect");
    }
    

    【讨论】:

    • 您不包括采用string 的构造函数。一般来说,如果你从Exception继承,你至少应该包含参数与Exception匹配的构造函数。
    • 这是一个公平的观点。我只是提供一个快速示例,而不是复制粘贴解决方案。
    【解决方案3】:

    这取决于其余代码的上下文。如果在应用程序未处于调用该方法的有效状态时调用该方法,则将使用 InvalidOperationException。如果应用程序状态有效,但 id 不存在,则可以使用 ArgumentOutOfRangeException。

    【讨论】:

      【解决方案4】:

      首先,System.Data 是特定于 ADO.NET 而不是特定于 ASP.NET。

      其次,如果您选择不使用ObjectNotFoundException,则始终有ArgumentException 可以让您执行以下操作:

      throw new ArgumentException("Given Id not found.", "id");
      

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 2013-05-20
        相关资源
        最近更新 更多