我目前正在構建一個API,該API執行的某個操作應該表明該操作是否成功。如果失敗,我還需要知道爲什麼失敗。 我應該如何實施?我是否應該使用void返回類型並在發生錯誤時拋出異常,或者是否應該返回一個bool以及某種消息來指示失敗的原因?返回帶有信息的成功指示器
回答
確定發生這種情況的頻率,如果答案經常出現,請考慮使用字符串引用參數來獲取帶有布爾返回值的消息和方法。
或者只是有一個字符串返回值,如果它成功,返回string.Empty,並只檢查它的長度以知道它是成功還是失敗。
第三個選項是作爲另一個回答者說要回一個枚舉,這將表明其原因,但不能對任何信息,從另一個異常等
保持如果這種情況很少出現,拋出異常。
而如果你最終使用具有的String.Empty字符串返回值作爲成功值,我建議在你的代碼註釋它,因爲它是不是一個偉大的做法是使用字符串作爲指標。 –
bool
帶消息可能是最好的。最終例外是昂貴的 - 無論是爲你的API處理還是客戶端處理 - 因此最好完全避免它們,並使用諸如前述的bool
和string
之類的構造。
在我看來,無效和例外應該沒問題。
如果失敗,異常消息應該足以告訴你發生了什麼。
如果成功了,然後繼續你的快樂方式。
毆打拳頭。此外,使用此方法,您可以拋出特定類型的異常,所以您可以在每種情況下以不同的方式處理它們。 –
發生異常時應拋出異常,即不期望的異常。
另一種選擇是使用enum
,以便返回不同的結果。像
public enum Results
{
Error,
Warning,
Minor,
}
東西然後他們可以用它
var result = YourApiCall();
if (result == Result.Error)
// Do something
你可以做的是從EventArgs
派生的類,並添加Boolean
屬性來檢查錯誤,那麼如果真有一個String
財產,他們可以從中獲取錯誤信息。
如果一個方法通常會被預期特定故障情況並可以處理它的代碼直接調用,那麼該方法應該通過除拋出異常之外的其他方法來區分成功或預期故障情況。請注意,調用者而不是的故障情況在任何情況下都應引發異常。如果某些調用代碼不會期待某個特定的故障情況,但其他代碼會這樣做,則有兩個版本的方法可能會很有幫助 - 其中一個版本會在問題場景中引發異常,其中一個會返回其他類型的錯誤指示。
微軟庫中使用的常見模式是使用命名模式DoSomething
和TryDoSomething
的一對方法。如果失敗,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
參數非空,請調用其上的方法以通知故障;它可以在內部存儲有關故障的信息;在函數返回後,它可以向傳入的對象詢問操作是否成功。
- 1. 返回帶有信息的ID MySQL/PHP
- 2. 帶返回碼和返回信息的PHP函數用於信息目的
- 3. Filepicker.io - didPickMediaWithInfo:不返回指定的信息
- 4. 如何從PHP中的腳本返回成功信息
- 5. JQuery沒有成功返回
- 6. 返回帶有javascript參數的消息
- 7. JQUERY AJAX - 函數成功返回帶有CFC查詢的「UNDEFINED」
- 8. 沒有返回所需的錯誤/成功的消息
- 9. 方法信息返回類型信息
- 10. 函數返回的信息
- 11. jQuery的AJAX功能的成功顯示信息
- 12. REST服務返回演示代碼的「有用」信息
- 13. connection.getMetaData似乎沒有返回表信息
- 14. PDO ERRORINFO沒有返回信息
- 15. domDocument沒有返回節點信息
- 16. JQUERY成功返回
- 17. jQuery成功功能不返回來自servlet響應的消息
- 18. 動態生成protobuf消息並返回指向它的指針
- 19. 如何從阿賈克斯jQuery的返回成功或錯誤信息
- 20. System.Reflection.Assembly.FullName返回過期信息?
- 21. Woocommerce返回虛假信息
- 22. SELECT返回錯誤信息
- 23. 返回錯誤信息PHP
- 24. checkdnsrr()返回錯誤信息
- 25. RegGetValue()返回錯誤信息
- 26. FQL Multiquery返回信息
- 27. jquery datatable不返回信息
- 28. COM,返回DATE信息
- 29. 使用pexpect返回信息
- 30. DateTime-> format(「U」)不返回帶時區信息的值
是出亂子,將很少發生特殊情況下,或者是有問題的預期標準使用情況?問題是否例外應該給你一些關於它是否應該拋出異常的想法。 – Servy
我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –