2013-08-16 79 views
0

我目前正在構建一個API,該API執行的某個操作應該表明該操作是否成功。如果失敗,我還需要知道爲什麼失敗。 我應該如何實施?我是否應該使用void返回類型並在發生錯誤時拋出異常,或者是否應該返回一個bool以及某種消息來指示失敗的原因?返回帶有信息的成功指示器

+2

是出亂子,將很少發生特殊情況下,或者是有問題的預期標準使用情況?問題是否例外應該給你一些關於它是否應該拋出異常的想法。 – Servy

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

確定發生這種情況的頻率,如果答案經常出現,請考慮使用字符串引用參數來獲取帶有布爾返回值的消息和方法。

或者只是有一個字符串返回值,如果它成功,返回string.Empty,並只檢查它的長度以知道它是成功還是失敗。

第三個選項是作爲另一個回答者說要回一個枚舉,這將表明其原因,但不能對任何信息,從另一個異常等

保持如果這種情況很少出現,拋出異常。

+0

而如果你最終使用具有的String.Empty字符串返回值作爲成功值,我建議在你的代碼註釋它,因爲它是不是一個偉大的做法是使用字符串作爲指標。 –

0

bool帶消息可能是最好的。最終例外是昂貴的 - 無論是爲你的API處理還是客戶端處理 - 因此最好完全避免它們,並使用諸如前述的boolstring之類的構造。

1

在我看來,無效和例外應該沒問題。

如果失敗,異常消息應該足以告訴你發生了什麼。

如果成功了,然後繼續你的快樂方式。

+0

毆打拳頭。此外,使用此方法,您可以拋出特定類型的異常,所以您可以在每種情況下以不同的方式處理它們。 –

0

發生異常時應拋出異常,即不期望的異常。

另一種選擇是使用enum,以便返回不同的結果。像

public enum Results 
{ 
    Error, 
    Warning, 
    Minor, 
} 

東西然後他們可以用它

var result = YourApiCall(); 
if (result == Result.Error) 
    // Do something 
0

你可以做的是從EventArgs派生的類,並添加Boolean屬性來檢查錯誤,那麼如果真有一個String財產,他們可以從中獲取錯誤信息。

1

如果一個方法通常會被預期特定故障情況並可以處理它的代碼直接調用,那麼該方法應該通過除拋出異常之外的其他方法來區分成功或預期故障情況。請注意,調用者而不是的故障情況在任何情況下都應引發異常。如果某些調用代碼不會期待某個特定的故障情況,但其他代碼會這樣做,則有兩個版本的方法可能會很有幫助 - 其中一個版本會在問題場景中引發異常,其中一個會返回其他類型的錯誤指示。

微軟庫中使用的常見模式是使用命名模式DoSomethingTryDoSomething的一對方法。如果失敗,DoSomething方法將拋出異常。它應該給調用者的任何數據將在返回值中指示。第二種方法將返回一個bool值,指示操作是否成功;主叫方的任何數據都將通過out參數指示。當微軟開始使用它時,這種方法可能是合理的,但它與自那時以來添加的語言功能不能很好地交互。除其他事項外:

  • 接口等IEnumerable<T>其中使用類型參數僅對函數返回值被允許相對於被協變到該類型(允許代碼預計例如一個IEnumerable<Animal>以接受IEnumerable<Cat>)。然而,協方差不起作用,參數爲out。如果圖案已經例如T TryGetSomething(ref bool Success)而不是bool TryGetSomething(ref T Result),協方差可用於「嘗試」方法。

  • 兩個VB.NET和C#允許語句其中兩個聲明和分配可變推斷基於賦值表達式的類型。雖然這很適合返回值提供數據的方法,但它不適用於通過參數out向調用方提供數據的方法。

除了這些限制,微軟的模式可能不是很理想您的方案,因爲它不包括機制,這不能說明它爲什麼這麼一個功能。另外,雖然微軟建議對具有一種方法,它可以作爲DoSomething和基於傳入的參數TryDoSomething作用,使用一種方法都具有一個主要優點:如果一個操作需要可能成功或失敗多個子操作,和如果任何一塊的失敗意味着操作作爲一個整體的失敗,人們可能會想有一個內部方法中的失敗拋如果從DoSomething稱爲異常,但如果從TryDoSomething稱爲返回錯誤代碼。使用單獨的「拋出」或「不拋出」內部方法的變體需要重複調​​用它們的代碼 - icky。

因此,我建議您可能想要定義一個INotifyOfFailure接口,並讓您的方法採用可選的INotifyOfFailure參數(默認爲空)。如果發生故障且INotifyOfFailure參數非空,請調用其上的方法以通知故障;它可以在內部存儲有關故障的信息;在函數返回後,它可以向傳入的對象詢問操作是否成功。