繁体   English   中英

何时引发异常或返回null?

[英]When to raise an exception or return null?

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

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

现在我对异常提升有点困惑。

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

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

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

谁能请我为这些概念澄清一下?

在第一种情况下,我可能会去一个例外和处理自己,而不是如果你的第一种方法是在返回的对象保存到一个令reference.There方式使用返回null.What是非常高的机会NullReferenceException是抛出,当有人试图调用该对象上的方法或属性时。

对于第二种方法,我会按照一些人的建议去寻找空列表。

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

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

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

  1. 首先阅读MSDN: 创建和抛出异常(C#编程指南) 它列出了当您需要抛出异常时的两种情况,以及何时避免它。
  2. 还要考虑C#中try / catch的实际开销是多少?

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


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

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

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

在您怀疑这更可能抛出错误的情况下,您可以添加DoesObjectExistTryGet类型方法(甚至扩展方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM