假如您是PHP老手,當然知道當PHP腳本出錯時發生了什麼事情。此時PHP解析器将在螢幕上給出錯誤資訊,如 Fatal error: Call to undefined function on line 19 --,是以程式在此處終止。這個資訊會吓到客戶,他可能立即打電話和你進行咨詢。

幸運的是,這裡有解決辦法。PHP擁有内置工具,可以讓開發人員捕捉腳本錯誤然後将它們轉到自定義的錯誤處理器。此時則可以對處理器進行程式設計顯示更多關于錯誤的具體資訊。(推薦學習:PHP程式設計從入門到精通)
還可以将錯誤寫入檔案或資料庫以采取補救措施。有時候還可以對處理器編寫程式忽略錯誤消息。
本文中,我将闡述如何使用PHP的錯誤處理API建構使用者自定義的錯誤處理器,并且說明如何以簡單而友好的方式顯示和治理腳本的錯誤資訊。
錯誤類型和報告級别
我們從最基本的開始。PHP有三種最基本的錯誤類型,從低級到進階分别為:注重、警告和錯誤(或緻命錯誤)。通常情況下,注重和警告不會終止程式;但是緻命錯誤則是危險故障(例如,調用一個沒有定義的函數或參考一個不存在的對象),将導緻程式中斷。這些錯誤有可能在啟動、解析、編譯或運作時發生。
要害字如E_NOTICE, E_ERROR等用于表明錯誤的不同類型和等級。在PHP手冊上可以獲得它們的具體資訊清單。
腳本階段錯誤顯示由error_reporting()函數進行控制。這一函數針對不同的錯誤等級設定不同的參數。表A給出了使用此函數報告警告和緻命錯誤的腳本程式。
表A
// display warnings and errors
error_reporting(E_WARNING | E_ERROR);
// this will generate a notice, which will never be displayed
echo $undefinedVar;
// this will generate a fatal error, which will be displayed
callUndefFunc();
?>
将表B中的代碼與上面的進行比較發現,Listing B中隐藏錯誤資訊甚至隐藏緻命資訊,使得錯誤資訊不會被顯示出來。
表B
// turn off error display
// no errors will be displayed
error_reporting(0);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?>
表C中的代碼将所有錯誤資訊甚至簡單的注重事項都顯示出來:
表C
// all errors will be displayed
error_reporting(E_ALL);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?>
如以上3個例子所示,error_reporting()函數在控制錯誤發生時,在螢幕上顯示内容非常重要。這裡的要害字是displayed,其表達的意思是錯誤不被顯示而不是錯誤沒有發生。是以,發生緻命錯誤時(例如不正确的函數調用),程式将被終止;但是,此時沒有任何消息顯示給使用者。