2012-01-28 50 views
5

我是新來的PHP和我有點困惑的事實,似乎沒有錯誤對象通信從一個方法到它的調用者。是PHP返回錯誤對象的壞習慣嗎?

這兩個是方法,我學會用:

  1. 如果一個方法應該錯誤不是信息的來電者只是觸發一個錯誤的,如果這不是E_USER_ERROR它只是可以返回FALSE告訴來電者出錯了。

  2. 另一方面,如果一個方法需要發回一些錯誤信息給調用者,應該引發一個異常。

來自COCOA我學會了在異常情況下使用異常(由於程序員錯誤導致的不可恢復錯誤)。在任何其他情況下,只需將錯誤對象傳遞給調用者即可。

  • 在PHP中哲學是不同的?
  • 例外情況是將錯誤數據發送給調用方的標準機制?
  • 我應該避免編程自己的錯誤對象,然後作爲出參數傳遞給與PHP模式一致的方法嗎?
+2

我打算回過頭來問一下「什麼時候最好返回一個錯誤對象而不是引發異常?」。 – 2012-01-28 10:27:07

回答

8

PHP有指示和處理程序中的流誤差兩種主要機制:

要選擇哪個取決於您的個人偏好。例外是對象,所以如果你想做OOP或來自另一種也使用例外的語言,你可能想要使用它們。基於非異常的錯誤處理適用於PHP可以發出的所有聲明,警告和錯誤,以及您自己的變體。如果你想把它們變成例外,看看ErrorException

但是,正如您已經提到的:異常是針對不可恢復的情況。他們是而不是用於管理定期控制流量。因此,例外並不是將錯誤消息發回給調用者的某種標準機制,例如,你不應該這樣做:

class FooValidator 
{ 
    public function isValid($valueToValidate) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     throw new ValidationException('Foo didnt satisfy rule Bar'); 
    } 
} 

他們嘗試/捕獲在調用者。驗證失敗是可恢復的情況。

一種辦法是引進Notification Object

class FooValidator 
{ 
    public function isValid($valueToValidate, Notification $notification) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     $notification->addMessage('Foo didnt satisfy rule Bar'); 
     return false; 
    } 
} 

在上面的例子中,驗證只返回一個布爾值,但可以收集關於爲什麼驗證在傳遞通知對象失敗的附加信息。這比從調用中返回錯誤對象更清潔,因爲我們不必檢查返回類型。如果驗證返回false,我們知道我們可以檢查Notification對象。由於對象是通過引用傳遞的,所以我們不需要從調用中返回對象,只需訪問調用者收集的消息即可。

+0

我喜歡這個答案,但我還沒有被說服你不應該使用異常來控制流量的說法。爲什麼不?異常的傳播不允許某種級別的外部函數以最合適的方式從錯誤中恢復?通過返回默認值,我們幾乎總是可以從我們預期的事情中「恢復」,但是評估返回值是否是有效調用的結果的邏輯將留給調用者。一個例外清楚地表明有些事情是錯誤的,並傳播到最合適的處理程序。請教育我 – 2012-01-28 12:13:33

+1

@ me232異常表示發生了異常事件(不僅僅是錯誤)。驗證失敗(如上例所示)並不例外。沒有任何理由通過異常處理過程來運行它。另請參閱http://www.c2.com/cgi/wiki?DontUseExceptionsForFlowControl和http://schlitt.info/opensource/blog/0724_python_good_bad_evil_03_flow_control_exceptions.html – Gordon 2012-01-28 12:18:53

+0

我同意在您的示例中使用異常相當毫無意義,因爲返回無論如何,假的價值可能是足夠的。該功能似乎能夠從問題本身中恢復過來。假設你有一個將一個對象轉換爲另一個對象的更復雜的例子。如果參數不適合轉換,拋出異常是錯誤的嗎?所有潛在的調用者是否應該實現一些驗證邏輯? – 2012-01-28 12:26:04

0

幾乎所有的東西都可能在PHP中,所以並不是真正的最佳方式。

看一看異常的php.net http://php.net/manual/en/language.exceptions.php

+5

我已經痛苦地認識到,對於每種語言幾乎一切都是可能的,這就是爲什麼設計模式讓我們的生活更輕鬆,避免我們重新發明輪子,並從別人的經驗中學習。官方文檔從不談論錯誤對象,這就是爲什麼我問。 – 2012-01-28 10:39:55