假如您是PHP老手,當然知道當PHP腳本出錯時發生了什么事情。此時PHP解析器將在屏幕上給出錯誤信息,如 Fatal error: Call to undefined function on line 19 --,因此程序在此處終止。這個信息會嚇到客戶,他可能立即打電話和你進行咨詢。
幸運的是,這里有解決辦法。PHP擁有內置工具,可以讓開發人員捕捉腳本錯誤然后將它們轉到自定義的錯誤處理器。此時則可以對處理器進行編程顯示更多關于錯誤的具體信息。還可以將錯誤寫入文件或數據庫以采取補救措施。有時候還可以對處理器編寫程序忽略錯誤消息。
本文中,我將闡述如何使用PHP的錯誤處理API構建用戶自定義的錯誤處理器,并且說明如何以簡單而友好的方式顯示和治理腳本的錯誤信息。
錯誤類型和報告級別
我們從最基本的開始。PHP有三種最基本的錯誤類型,從低級到高級分別為:注重、警告和錯誤(或致命錯誤)。通常情況下,注重和警告不會終止程序;但是致命錯誤則是危險故障(例如,調用一個沒有定義的函數或參考一個不存在的對象),將導致程序中斷。這些錯誤有可能在啟動、解析、編譯或運行時發生。
要害字如E_NOTICE, E_ERROR等用于表明錯誤的不同類型和等級。在PHP手冊上可以獲得它們的具體信息列表。
腳本階段錯誤顯示由error_reporting()函數進行控制。這一函數針對不同的錯誤等級設置不同的參數。表A給出了使用此函數報告警告和致命錯誤的腳本程序。
表A
- <?php
- // 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
- <?php
- // 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
- <?php
- // 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,其表達的意思是錯誤不被顯示而不是錯誤沒有發生。因此,發生致命錯誤時(例如不正確的函數調用),程序將被終止;但是,此時沒有任何消息顯示給用戶。
新聞熱點
疑難解答