2013-02-22 140 views
1

這更多的是一個架構問題。我想知道人們如何正確處理完全面向對象的PHP環境中的錯誤。正確的錯誤處理方式

例如,我有一個類從數據庫中檢索所有用戶數據。所以我會以這種方式使用它:

$userData = new UserDataConnection(); 
$userData->openDatabase(); 
$userData->retrieveData(); 
$userData->showData(); 
$userData->closeDatabase(); 

在上述每個步驟中,都可能發生錯誤。所以我會從每一步返回一個布爾值,說明函數是否已經成功執行(因此錯誤檢查在每個函數中),還是我會在整個事情上做一個try-catch異常處理?或者,還有更好的方法?

當某種錯誤發生時,總是會遇到某種錯誤頁面會更好嗎?

+0

例外情況良好,因爲您甚至可以捕捉到無與倫比的異常。但是錯誤處理主要取決於程序員和他們的風格,而不是一些預設標準。 – 2013-02-22 09:54:41

+0

[處理錯誤的最佳方法]的可能的重複(http://stackoverflow.com/questions/4227749/best-way-to-handle-errors) – deceze 2013-02-22 09:55:29

+0

確實人們有偏好和風格,但我只是看因爲我不是一個PHP程序員。這裏的大部分例子都是基於非面向對象的方法,或者使用die()來過早地停止腳本,這看起來非常糟糕和混亂。 – AndyTang 2013-02-22 11:35:54

回答

1
<?php 

$ERROR = false; 
try { 

    $userData = new UserDataConnection(); 
    $userData->openDatabase(); 
    $userData->retrieveData(); 
    $DETAILS = $userData->showData(); 
    $userData->closeDatabase(); 

} catch(Exception $e) { 

    $ERROR = $e->getMessage(); // exit; 

} 

if($ERROR) { 
    $DETAILS = array(); 
} 

?> 

如果您使用的是PDO,則可以拋出PDOException。

+0

$ e-> getMessage()會自動從mySQLi數據庫對象中檢索錯誤消息嗎?或者我需要把它放在函數調用中嗎? – AndyTang 2013-02-22 11:37:34

+0

您必須拋出它或使用PDO並捕獲PDOException。 – vectorialpx 2013-02-24 12:56:11

1

它通常歸結爲一個簡單的問題:

願此功能「合法」失敗,或者是任何故障的東西是真的錯了的標誌?

如果某個函數需要某種輸入,並且永遠不會使用其他類型的輸入調用,則任何提供正確輸入的失敗都是InvalidArgumentException。對於不直接處理用戶輸入的函數尤其如此。這種類型的提示可以更好地工作。

如果函數在給定正確的輸入的情況下應始終產生特定的結果,則函數產生該結果的任何失敗是RuntimeExceptionLogicException或某種其他類型的異常。

如果函數可能產生或不產生某種結果,false是合法的返回值。處理用戶輸入並因此得到非常隨意的輸入值的函數通常可以返回false

一些例子:

  • getDatabaseConnection()是在投擲RuntimeException完全正確的或類似的,如果它不能建立與數據庫的連接。這是特殊情況在這種情況下,無法繼續工作。
  • transformFooIntoBar(Foo $foo)如果無法返回Bar實例,則無論出於何種原因,都可以拋出某種形式的異常。該功能具有明確的目的和類型檢查輸入值。如果在這樣清晰的條件下不能完成工作,那麼顯然是錯誤的,必須修正。埃爾戈,一個例外。
  • checkIfUserExists($id)很可能會返回false,因爲它的工作是返回大拇指或拇指向下。鑑於此職位描述,不存在的用戶不是特殊情況

在哪裏捕捉拋出的異常取決於你想處理它的地方。數據庫連接錯誤應該可能在調用堆棧的頂部被捕獲,因爲如果數據庫關閉,您可能無法做任何事情。另一方面,如果某個模塊正在調用某個子模塊,並且有一半模塊期望該子模塊發生故障並且/或者在發生故障時有應急計劃,則該模塊可能會捕獲該子模塊的異常並繼續執行其工作。例如getRSSUpdates()撥打電話HTTP::fetchContents($url)。如果URL返回404,則HTTP模塊可能會引發異常,因爲在這種情況下它不能返回內容。 getRSSUpdates()函數爲此做好了準備,並將此情況作爲「此時沒有更新」處理。

相關問題