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

3
我正在构建一个应用程序服务层,其中一个方法接受实体的ID(整数)并返回引用的实体。尽管看起来很简单,但是在查看.NET异常的众多选项时,我不完全确定如果找不到具有给定ID的实体应该抛出哪个异常(我不想只返回null)。

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


可能是.NET中无效或意外参数应抛出哪些异常?的重复问题。 - mbeckish
4个回答

8
首先,System.Data 是与 ADO.NET 相关的,而不是与 ASP.NET 相关的。
其次,如果您选择不使用 ObjectNotFoundException,则总有一种叫做 ArgumentException 的方法可以让您执行以下操作:
throw new ArgumentException("Given Id not found.", "id");

3

ArgumentOutOfRangeException - 当用户提供错误的ID时,这并不是方法的错(正如您所有的异常所表明的那样)。

ArgumentException 更加简洁。


1
你可以创建自己的异常,例如 InvalidEntityIdProvidedException,并将其抛出。
class InvalidEntityIdProvidedException : Exception { }

然后像这样调用它:
if ( entityId < 0 ) {
    throw new InvalidEntityIdProvidedException("The entity id provided is incorrect");
}

你没有包含一个接受 string 参数的构造函数。通常,如果你继承自 Exception,你应该至少包含与 Exception 相匹配的参数构造函数。 - juharr
这是个很好的观点。我只是提供了一个快速示例,而不是复制粘贴解决方案。 - the_seeker_who

1

这取决于你代码的上下文。如果在应用程序不处于调用该方法的有效状态时调用了某个方法,则应使用InvalidOperationException。如果应用程序状态有效,但ID不存在,则可以使用ArgumentOutOfRangeException。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接