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