2013-03-25 35 views
4

我正在開發一個API接口,它可以返回許多(最多一百個)不同的錯誤代碼。遇到這樣的代碼時,我的接口應該會引發異常。我的PHP是一個有點生疏,所以我不能確定這將是一個當今PHP程序員最適合的選項:將API錯誤代碼轉換爲例外

  • 有一個單獨的MyApiThisAndThatError類爲每個錯誤代碼?
  • 或具有通用類MyApiError並提供API錯誤代碼作爲參數?

我也接受其他建議。

+0

如果錯誤代碼可以按邏輯進行分組(如:登錄錯誤,API查詢中的語法錯誤,...),那麼可以證明相應的命名異常類。 – CBroe 2013-03-25 12:53:28

回答

7

TLDR:使用通用MyApiException類,包括API錯誤代碼。

拉爾夫·辛德勒在http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3

寫上常見的主題一個很好的文章如果你讀了整個事情,你會看到一個部分最佳實踐庫代碼演示(我已經修改了他的榜樣的此上下文中):

// usage of bracket syntax for brevity 
namespace MyCompany\Component { 

    interface Exception 
    {} 

    class MyApiException 
     extends \RuntimeException 
     implements Exception 
    {} 

    class Component 
    { 
     public static function doSomething() 
     { 
      $myApiCall->doSomthing(); 
      if ($myApiCall->hasError) { 
       throw new MyApiException($myApiCall->getMessage(), $myApiCall->getErrorCode); 
      } 
     } 
    } 
} 

假設上面的代碼,如果一個人執行MyCompany的\元器件\元器件:: doSomething的(),即從所述的doSomething()方法可以通過任何被捕獲發射的例外以下類型:PHP的例外,SPL的RuntimeException組件的MyCompany \ Component \ MyApiException或組件的MyCompany \ Component \ Exception。這爲調用者提供了許多機會來捕獲庫中給定組件發出的異常,這是由返回的API錯誤引發的。此外,通過分析組成例外的類型,可以對剛剛發生的特殊情況給出更多的語義含義。

+0

謝謝,這就是我一直在尋找的。 – georg 2013-04-02 10:01:54

3

我有類似的問題。當我這樣做時,我將所有錯誤劃分爲家族(即查詢,模型,控制器,表單等),然後在每個錯誤系列中,我爲每個錯誤代碼定義了常量。

理想情況下,我想擁有一個統一的異常類,但是在某些地方我會在try catch塊中有一組函數調用,最好讓它們分成不同的家族,這樣我就可以爲每個錯誤系列做一個捕獲,這將適當地確定下一步該做什麼。是的,我可以有一個統一的錯誤捕獲器和一個函數來確定錯誤編號中的家族,但它看起來不那麼優雅。

+0

謝謝!是的,「優雅」是關鍵詞。 – georg 2013-04-02 09:58:41

3

這取決於幾個因素。在我看來,這些是特定例外的原因:

  1. 您可以在邏輯上對錯誤進行分組,並在邏輯上命名異常。
  2. 錯誤有額外的數據取決於錯誤類型(您可以存儲這些額外的數據,用戶可以很好地使用set/get來訪問它們)。
  3. 很少添加新的錯誤類型(但對於未知的錯誤代碼,您總是可以拋出一些基本的通用異常)。
  4. 錯誤的含義隨時間變化(您的界面的用戶將基於異常類型,而不是基礎錯誤代碼)。
  5. 您已準備好正確記錄您的特定異常,以便用戶不必根據基礎錯誤代碼查找API文檔。
+0

謝謝,這聽起來很合理。 – georg 2013-04-02 09:57:40