应该为无效ID抛出什么异常?

时间:2015-03-10 18:03:32

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

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

ArgumentOutOfRangeException - 用户提供错误的ID并不是方法的错(正如所有异常所暗示的那样)。

ArgumentException不那么详细。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

class InvalidEntityIdProvidedException : Exception { }

然后这样称呼它:

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