2011-04-20 57 views
0

我在PHP中使用了一個自定義錯誤處理程序和完整的錯誤報告來跟蹤錯誤。這對調試非常有用,並將所有錯誤記錄在數據庫中以便稍後調查。如何通過PHP中的嚴格報告來管理錯誤?

無論如何,現在這種方法禁止使用@忽略發生錯誤時的錯誤。我現在遇到了這個問題,我嘗試在我的系統上重命名一個目錄,因爲它偶爾會引發錯誤(如果文件正在被訪問)。

我希望能夠在我的代碼中捕獲這個錯誤,以防止執行其餘的函數,但我也不希望這個錯誤出現在我的錯誤日誌數據庫中(考慮到這個錯誤是'管理'在代碼中,沒有必要看到它失敗了)。

有沒有簡單的解決方案呢?我嘗試使用try/catch,但它似乎仍然會拋出錯誤。

+0

我可以看到你的try/catch塊嗎? – 2011-04-20 05:27:39

回答

1

@zerkms'解決方案將很好地工作,但我的錯誤處理程序已經完成,從而延長該給我的功能,我只是包括:

if (error_reporting() == 0) 
    return; 

在我的處理程序的開始。這樣,如果在函數上使用@,錯誤仍然被拋出,但在處理程序的開始時被忽略(因此,未登錄到數據庫等),我仍然會從函數中獲得布爾結果,例如作爲rename()

如果需要的話,這也使我能夠在代碼上使用try/catch解決方案。

1

可以將所有的錯誤/警告/通知轉換爲例外

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    if (error_reporting() == 0) { 
    return; 
    } 
    if (error_reporting() & $severity) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
    } 
} 
set_error_handler('exceptions_error_handler'); 

我覺得這是更好地處理異常,比PHP原生的錯誤。

+0

嗯,謝謝。這是進步,但現在所有錯誤都需要使用try/catch是否正確?我的函數不再將錯誤記錄到數據庫,因爲這個異常被拋出,所以如果我不在腳本中使用try/catch,那麼這些錯誤不會被記錄。 – Rhys 2011-04-20 05:42:00

+0

@Rhys:這取決於你想要達到的目標。在我的應用程序中,如果錯誤真的出乎意料,那麼它將被捕獲到全局try-catch包裝器中,在那裏它會被記錄下來,並在其中回覆某種Sorry頁面給用戶。如果出現錯誤(比如當我們在數據庫中有唯一的約束錯誤時) - 那麼我就地處理它並不記錄(因爲它不需要記錄,因爲它是「預期」錯誤之一) – zerkms 2011-04-20 05:45:39