我正在构建一个应用程序服务层,我的一个方法接受实体的ID(整数)并返回引用的实体。虽然看起来应该很简单,但是通过大量的.NET异常,我不完全确定如果找不到具有给定ID的实体我应该抛出什么异常(我不想只返回null)
有ObjectNotFoundException,但是在System.Data
命名空间中,这意味着它应该是特定于ASP.NET的,而事实并非如此。有NullReferenceException,但是建议程序员不要因为它是“内部”而抛出它,而且我不确定它在这种情况下是否完全正确。我不想抛出通用Exception。那么,什么特定的异常类最有意义扔到这里?由于这是一个应用服务层方法(因此非常抽象),我是否应该将自己限制在System.SystemException命名空间和/或自定义异常中的异常?
答案 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");
}