5

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

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

现在我对异常引发有点困惑。

在 RetrieveById 函数的情况下,小于 1 的 id 是无效的 id,因此我想引发异常。而且我想为数据库中不存在的 Id 返回 null 。然后感觉我太复杂了。

在 RetrieveByStatus 的情况下,当数据库中没有该状态的数据时,我想返回一个空列表。

但是我看到有些人在 RetrieveById 不能返回任何东西时引发异常,但是 RetrieveByStatus 在没有记录时不应该引发异常还是应该引发异常?

谁能为我澄清这些概念?

4

4 回答 4

3

我宁愿null在第一种情况下返回,empty list 在第二种情况下返回。

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

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

于 2012-10-26T04:15:30.957 回答
3
  1. 首先阅读 MSDN:Creating and Throwing Exceptions (C# Programming Guide)。它列出了您应该抛出异常以及何时避免它的两种情况。
  2. 还要考虑C# 中 try/catch 的真正开销是什么?

在任何情况下,您都必须处理 null 返回或抛出的异常


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

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

于 2012-10-26T04:26:40.020 回答
3

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

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

于 2012-10-26T04:34:44.540 回答
-1

我喜欢尽可能避免返回 null,因为NullRefExceptions它比特定异常更神秘,比如OrderNotFoundException. 此外,当您必须不断期望实体为空时,代码会变得非常迟钝。无论如何,这应该是一个例外情况——如果 db 中不存在该 id,你从哪里得到它?

On the cases you suspect this is more likely to throw an error, you could add a DoesObjectExist or TryGet type method (or even extension method).

于 2012-10-26T04:59:19.940 回答