何时引发异常或返回null?

时间:2012-10-26 04:09:38

标签: c# exception-handling

我在数据访问层上有一些功能

public Order RetrieveById(int id)
public List<Order> RetrieveByStatus(OrderStatus status)

现在我对异常提升感到有些困惑。

在RetrieveById函数的情况下,小于1的id是无效的id,因此我想提出异常。我想为数据库中不存在的Id返回null。然后感觉我过度复杂。

对于RetrieveByStatus,我觉得当数据库中没有该状态的数据时返回一个空列表。

但是我看到有些人在RetrieveById无法返回任何内容时引发异常,但是当没有记录时,RetrieveByStatus不应该引发异常或应该是什么?

有人可以请我澄清这些概念吗?

4 个答案:

答案 0 :(得分:4)

在第一种情况下,我可能会寻找异常并处理自己,而不是返回null。如果您的第一个方法以返回的对象保存到Order引用的方式使用,那么。有很大的机会当有人试图调用该对象上的方法或属性时,抛出NullReferenceException

对于第二种方法,我会按照一些人的建议选择一个空列表。

答案 1 :(得分:3)

  

我希望在第一种情况下返回nullempty list   在第二种情况下。

但是如果你想引发异常那么你可以为public Order RetrieveById(int id)引发异常,因为这意味着id无效,因为调用第一种方法意味着你知道id和它需要在那里。

在第二种情况下,OrderStatus可能有效,并且没有找到针对它的记录,因此返回空列表是个好主意。

答案 2 :(得分:1)

  1. 首先阅读MSDN:Creating and Throwing Exceptions (C# Programming Guide)。它列出了当您需要抛出异常以及何时避免异常时的两种情况。
  2. 还要考虑What is the real overhead of try/catch in C#?
  3. 在任何情况下,您都必须处理空返回或抛出异常


    至于我自己,我更喜欢你的两种方法都不要明确地抛出异常。我会说,没有什么不好,如果你的方法返回null,如果它无法通过id找到一个对象。而RetrieveByStatus方法可以返回一个空集合,而不是null。

    此外,您可以遵循LINQ中使用的模式,例如,Enumerable.FirstEnumerable.FirstOrDefault方法(抛出异常或返回null),因此您可以使用相应的方法。某些情况,当id 100%有效或相反时,它可能会丢失。返回序列元素的方法如果返回的序列看起来是空的,则不会抛出异常;考虑Enumerable.Where

答案 3 :(得分:0)

我希望尽可能避免返回null,因为NullRefExceptions比特定的异常更加神秘,比如OrderNotFoundException。此外,当你不得不经常期望实体为空时,代码变得相当迟钝。无论如何,这应该是一个例外情况 - 如果数据库中不存在该ID,您在哪里获得该ID?

对于您怀疑这更有可能引发错误的案例,您可以添加DoesObjectExistTryGet类型方法(甚至是扩展方法)。