簡體   English   中英

insert方法是應該返回一個對象還是拋出異常

[英]Should an insert method return an object or throw exceptions

我正在設計一個API(第一次),它將是一個非常公開的(免費在線服務)。

我正在考慮返回結構,如InsertResult ,它可以具有失敗或成功時的屬性(即行數),錯誤消息等。 現在,另一種方法是從API插入方法中拋出異常。 我知道這是一個“一般和開放”的問題但是,對於API來說,什么被認為更干凈和更完美?

腳本

API是一個DLL(內部調用和使用來自4或5個不同來源的Web服務,並且根據地理定位等內容決定與哪個服務進行交互)。 它是使用C#和Mono構建的。 使用方案包括API作為來自桌面,移動和Web客戶端的庫。 這確實是問題,假設一個離線用例,從Web客戶端它根本不會發生但是從移動或桌面它可以(更頻繁地從移動設備)做什么呢? 如何管理說插入調用以便在移動應用程序脫機時存儲模擬。 或者當發生另一個(服務器相關的)錯誤

通常,如果用戶嘗試執行無效操作,則應拋出異常。 但是,您還應該提供一個代碼路徑,允許用戶合理地檢查可能在異常發生之前拋出異常的條件。 如果它很重要(可能出於性能原因),您可能希望包含一個TryInsert方法,該方法可以安全地處理無效插入,並只返回一個有效的bool來表示成功。

這適用於純C#API以及服務API。

拋出異常是在C#/ .NET中處理錯誤和意外情況的更自然的方法。 此外,.NET為您提供了定義自己的異常或使用現有異常之一的可能性。
此外,通過提供諸如finally{} -blocks之類的東西,您可以在出現問題時創建非常順暢的內容。
如果用戶沒有正確地對您的返回值做出反應,那么檢查返回值是容易出錯的,並且可能會使進程不穩定。 未處理的異常通常會停止進程,因此強制用戶檢查后台。 不過,這是我的看法。

MSDN上,他們說,如果例如參數錯誤而你不能繼續錯誤的輸入,那么拋出異常是一個很好的理由。

由於問題是“一般和開放”,我認為如果我們考慮最常用的網絡服務,如谷歌,亞馬遜,我認為他們都遵循盡可能精確提供細節的原則,所以任何消費它的人都知道他們做錯了什么。

如果您只是提出異常,那么您的API用戶可能會對您造成更多錯誤。

因此,總結一下,總是一個好主意來定義眾所周知的錯誤代碼並將相同的信息傳遞給客戶/消費者,這樣他們就可以輕松找出問題的錯誤或我該怎么做才能糾正錯誤。 僅僅為了一個例子,由於某些原因你的api只接受特定的編碼,那么用戶將會對此感到沮喪。

我建議返回一個詳細的錯誤。 由於您使用Web服務進行消費,因此並非所有人都使用相同的技術與其進行交互。 如果您在制作框架的地方,那么我會說使用異常,因為開發人員將使用相同的技術來使用它。 這是異常在框架級別更有用的地方。

UPDATED(有問題的API實際上是一個框架):由於您現在正在討論使用框架,因此您應該拋出異常,因為客戶端必須引用DLL並且知道可能的框架異常。 要使用這些庫,它必須是符合CLR的語言,因此它們應該具有相同的概念,類,異常等......

對於API,異常總是更好。 API使用者可以使用catch塊對各種異常進行操作。 如果您使用錯誤消息和錯誤代碼,則要求API使用者編寫If語句。 下面的代碼段總是比你有的東西更干凈If條件來檢查錯誤。

因此,從API消費者的角度來看,它總是更加清晰,因為API會拋出異常

try
{
    yourAPIClass.YourMethod();
}
catch(YourException1 ex)
{
   action1();

}
catch(YourException2 ex)
{
   action1();

}

這是編寫和拋出異常的良好指南http://blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM