簡體   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