2011-05-18 83 views
8

我正在開發一個API包裝類,這是我做的第一個。 大部分它並沒有太困難。 到達需要處理由API返回的錯誤的可能性,但是我應該如何處理這些錯誤。什麼時候應該拋出異常而不是在PHP中返回錯誤?

外部文件將調用API類,即findVenueByLocationID($locationID); 該函數將構造API調用的URL和方法(POST,GET,DELETE等)並將其傳遞給一個名爲makeCall的函數。

MakeCall構造完成的URL,將請求發送到服務並返回生成的XML。如果API返回一個錯誤,它就在它返回的XML中。該URL使用函數file_get_contents()來調用。該API具有一定數量的錯誤代碼,它將在XML中返回。

據我瞭解,我應該做的功能MakeCall函數中執行以下操作:

  • 返回XML之前,先檢查,看看它是否包含一個錯誤代碼,如果是的話,傳遞一個錯誤處理類來處理錯誤。 (日誌和返回客戶端版本錯誤信息)
  • 添加一個圍繞file_get_contents()函數的try catch來捕獲任何連接錯誤,即無法訪問服務器?

這被認爲是最好的辦法嗎? 我應該在makeCall的調用中添加try catch,而不是在file_get_contents中添加try_all? 我應該爲XML返回的每個錯誤拋出一個異常,並用錯誤類來處理它們嗎?

我在尋找的答案應該還包含一個資源鏈接,解釋一些關於API封裝器或類似事情的錯誤處理的最佳實踐。

在此先感謝您的時間和回覆。


編輯: 與我們的CTO交談後,在當前版本的PHP錯誤也有例外,我應該拋出異常,並留下異常給調用者的交易。請記住,我正在爲API實現包裝類。思考?

+0

'file_get_contents()'觸發警告,如果它不能檢索或讀取資源,所以try ... catch不會幫助你。如果您使用諸如'Zend_Http_Client'的類,您將能夠更容易地攔截失敗。 – 2011-05-18 15:09:03

回答

3

您應該首先了解異常和錯誤之間的區別:發生錯誤,異常例外。

例如,輸入錯誤密碼(無法登錄)的用戶出錯。當數據庫在檢查密碼時不可用時,您會得到一個異常(並希望能正常處理該異常)。

所以,如果你從第三方獲得XML,你可能會認爲它是有效的。但可能會有錯誤。如果API給你一個錯誤(找不到位置),它也可能是你的錯誤。只有在特殊情況下(你已經硬編碼了一個你肯定知道的位置肯定會存在),這可能是一個例外。

最瑣碎的例外是連接錯誤:那麼肯定有什麼錯誤。另一個簡單的事情就是你可以期待的API錯誤,比如「沒有新的信息」(就像一個例子):這是一個內部錯誤。在某個地方你必須畫出一條線,但在大多數情況下,它很清楚什麼是例外,什麼是可能發生的錯誤。

+0

感謝您對此的看法。看起來像我們的uni錯過了這個重要的信息...可以更好地解釋爲一個錯誤是當數據處理有問題,並且例外是當過程不能完成? – Relequestual 2011-05-18 16:56:48

+0

這是一個很常用的變體,我猜可能可以在這種情況下使用,但請記住,沒有「真正的」和絕對的解決方案,只有每種情況的指導方針。例如,如果你有一個情況(已知錯誤的連接,也許你甚至在測試連接),一個進程不會完成,你可能會說這是一個錯誤。所以在這種情況下,你的連接會拋出一個異常(因爲對於連接來說很奇怪:它不能做它應該做的事情),但是你會在你的測試程序中捕獲它並返回一個錯誤。 – Nanne 2011-05-18 21:28:28

相關問題