我在数据访问层上有一些功能
public Order RetrieveById(int id)
public List<Order> RetrieveByStatus(OrderStatus status)
现在我对异常提升感到有些困惑。
在RetrieveById函数的情况下,小于1的id是无效的id,因此我想提出异常。我想为数据库中不存在的Id返回null。然后感觉我过度复杂。
对于RetrieveByStatus,我觉得当数据库中没有该状态的数据时返回一个空列表。
但是我看到有些人在RetrieveById无法返回任何内容时引发异常,但是当没有记录时,RetrieveByStatus不应该引发异常或应该是什么?
有人可以请我澄清这些概念吗?
答案 0 :(得分:4)
在第一种情况下,我可能会寻找异常并处理自己,而不是返回null。如果您的第一个方法以返回的对象保存到Order引用的方式使用,那么。有很大的机会当有人试图调用该对象上的方法或属性时,抛出NullReferenceException
。
对于第二种方法,我会按照一些人的建议选择一个空列表。
答案 1 :(得分:3)
我希望在第一种情况下返回
null
并empty list
在第二种情况下。
但是如果你想引发异常那么你可以为public Order RetrieveById(int id)
引发异常,因为这意味着id
无效,因为调用第一种方法意味着你知道id
和它需要在那里。
在第二种情况下,OrderStatus
可能有效,并且没有找到针对它的记录,因此返回空列表是个好主意。
答案 2 :(得分:1)
在任何情况下,您都必须处理空返回或抛出异常
至于我自己,我更喜欢你的两种方法都不要明确地抛出异常。我会说,没有什么不好,如果你的方法返回null,如果它无法通过id找到一个对象。而RetrieveByStatus
方法可以返回一个空集合,而不是null。
此外,您可以遵循LINQ中使用的模式,例如,Enumerable.First和Enumerable.FirstOrDefault方法(抛出异常或返回null),因此您可以使用相应的方法。某些情况,当id
100%有效或相反时,它可能会丢失。返回序列元素的方法如果返回的序列看起来是空的,则不会抛出异常;考虑Enumerable.Where。
答案 3 :(得分:0)
我希望尽可能避免返回null,因为NullRefExceptions
比特定的异常更加神秘,比如OrderNotFoundException
。此外,当你不得不经常期望实体为空时,代码变得相当迟钝。无论如何,这应该是一个例外情况 - 如果数据库中不存在该ID,您在哪里获得该ID?
对于您怀疑这更有可能引发错误的案例,您可以添加DoesObjectExist
或TryGet
类型方法(甚至是扩展方法)。