PHP 錯(cuò)誤處理機(jī)制
在日常的項(xiàng)目開發(fā)過程中,總是會(huì)出現(xiàn)一些我們意想不到的異常錯(cuò)誤,如果我們對(duì)此沒有進(jìn)行相對(duì)完善的處理,那么程序看上去也很不專業(yè),也很可能就會(huì)成為別人攻擊系統(tǒng)的有效信息;有些錯(cuò)誤異常會(huì)終止腳本執(zhí)行,這個(gè)時(shí)候如果沒有一些錯(cuò)誤提示信息的話,那么我們只能從頭開始看代碼了,要知道項(xiàng)目中成百上千行的代碼對(duì)我們來說是件多么恐怖的事情啊,那么我們?nèi)绾卧陧?xiàng)目開發(fā)的過程中快速準(zhǔn)確地定位到異常、錯(cuò)誤呢,并進(jìn)行相應(yīng)的處理,本文由自己對(duì)錯(cuò)誤、異常處理的了解,再此分享與大家相互學(xué)習(xí)交流,并作為一個(gè)備忘。
系統(tǒng)錯(cuò)誤處理器:
PHP正常情況下,錯(cuò)誤會(huì)正常的輸出,但在一些框架中,可能會(huì)影響錯(cuò)誤的輸出,可能是框架本身有自己的處理機(jī)制,也可能代碼中作處理了,一般是這幾個(gè)函數(shù)設(shè)置:
1.error_reporting(); 設(shè)置PHP 的報(bào)錯(cuò)級(jí)別并返回當(dāng)前級(jí)別
error_reporting(report_level)
如果參數(shù) level 未指定,當(dāng)前報(bào)錯(cuò)級(jí)別將被返回。下面幾項(xiàng)是 level 可能的值:
值 |
常量 |
描述 |
1 |
E_ERROR |
致命的運(yùn)行時(shí)錯(cuò)誤。不能回收此錯(cuò)誤。腳本被中斷執(zhí)行。 |
2 |
E_WARNING |
非致命的運(yùn)行時(shí)警告。腳本不被中斷執(zhí)行。 |
4 |
E_PARSE |
編譯時(shí)分析錯(cuò)誤。解析應(yīng)該只由分析器生成的錯(cuò)誤 |
8 |
E_NOTICE |
運(yùn)行時(shí)通知。該腳本發(fā)現(xiàn)可能是一個(gè)錯(cuò)誤,但通常運(yùn)行一個(gè)腳本時(shí),也可能發(fā)生 |
16 |
E_CORE_ERROR |
致命錯(cuò)誤在PHP啟動(dòng)時(shí)。這就好比在PHP核心的E_ERROR |
32 |
E_CORE_WARNING |
在PHP啟動(dòng)時(shí)警告。這就好比在PHP核心的E_WARNING |
64 |
E_COMPILE_ERROR |
致命的編譯時(shí)錯(cuò)誤。這就好比通過了Zend腳本引擎產(chǎn)生的E_ERROR |
128 |
E_COMPILE_WARNING |
非致命編譯時(shí)警告。這就好比通過了Zend腳本引擎產(chǎn)生E_WARNING |
256 |
E_USER_ERROR |
致命的用戶生成的錯(cuò)誤,這類似于程序員使用PHP函數(shù) trigger_error() 設(shè)置的 E_ERROR |
512 |
E_USER_WARNING |
非致命的用戶生成的警告,這類似于程序員使用PHP函數(shù) trigger_error 設(shè)置的 E_WARNING |
1024 |
E_USER_NOTICE |
用戶生成的通知,這類似于程序員使用PHP函數(shù)trigger_error 設(shè)置的 E_NOTICE |
2048 |
E_STRICT |
運(yùn)行時(shí)通知。PHP建議改變你的代碼,以幫助該代碼的互操作性和兼容性 |
4096 |
E_RECOVERABLE_ERROR |
可捕獲的致命錯(cuò)誤,類似 E_ERROR,但可被用戶定義的處理程序捕獲(參見 set_error_handler()) |
8191 |
E_ALL |
所有的錯(cuò)誤和警告,除級(jí)別E_STRICT(在PHP6.0中,E_STRICT將是E_ALL的一部分) |
這里值得注意的是,$level為0的時(shí)候是關(guān)閉錯(cuò)誤輸出,也就是任何錯(cuò)誤都不會(huì)輸出。
2.set_error_handler()
定義和用法
set_error_handler() 函數(shù)設(shè)置用戶自定義的錯(cuò)誤處理函數(shù)。
該函數(shù)用于創(chuàng)建運(yùn)行時(shí)期間的用戶自己的錯(cuò)誤處理方法。
該函數(shù)會(huì)返回舊的錯(cuò)誤處理程序,若失敗,則返回 null。
語法
set_error_handler(error_function,error_types)
參數(shù) |
描述 |
error_function |
必需。規(guī)定發(fā)生錯(cuò)誤時(shí)運(yùn)行的函數(shù)。 |
error_types |
可選。規(guī)定在哪個(gè)錯(cuò)誤報(bào)告級(jí)別會(huì)顯示用戶定義的錯(cuò)誤。默認(rèn)是 "E_ALL"。 |
提示:如果使用了該函數(shù),會(huì)完全繞過標(biāo)準(zhǔn)的 PHP 錯(cuò)誤處理函數(shù),如果必要,用戶定義的錯(cuò)誤處理程序必須終止 (die() ) 腳本,
注釋:如果在腳本執(zhí)行前發(fā)生錯(cuò)誤,由于在那時(shí)自定義程序還沒有注冊(cè),因此就不會(huì)用到這個(gè)自定義錯(cuò)誤處理程序。
測(cè)試代碼如下:
/** * * @param type $error_level 錯(cuò)誤級(jí)別 * @param type $error_message 錯(cuò)誤信息 * @param type $error_file 可選 錯(cuò)誤文件 * @param type $error_line 可選 錯(cuò)誤行 * @param type $error_context 可選。規(guī)定一個(gè)數(shù)組,包含了當(dāng)錯(cuò)誤發(fā)生時(shí)在用的每個(gè)變量以及它們的值。 */ function my_error($error_level, $error_message, $error_file, $error_line, $error_context) { echo date('Y-m-d H:i:s') . $error_level . $error_message . $error_file . $error_line; var_dump($error_context); } set_error_handler('my_error', E_ALL); print_r($a);
//通過上案例可以得知,在注冊(cè) my_error 方法時(shí),系統(tǒng)會(huì)自動(dòng)覆蓋原有的錯(cuò)誤處理 error_fuction() 方法
以上程序運(yùn)行結(jié)果:
自定義錯(cuò)誤觸發(fā)器
定義和用法
trigger_error() 函數(shù)創(chuàng)建用戶定義的錯(cuò)誤消息。
trigger_error() 用于在用戶指定的條件下觸發(fā)一個(gè)錯(cuò)誤消息。它與內(nèi)建的錯(cuò)誤處理器一同使用,也可以與由 set_error_handler() 函數(shù)創(chuàng)建的用戶自定義函數(shù)使用。
如果指定了一個(gè)不合法的錯(cuò)誤類型,該函數(shù)返回 false,否則返回 true。
語法
trigger_error(error_message,error_types)
參數(shù) |
描述 |
error_message |
必需。規(guī)定錯(cuò)誤消息。長(zhǎng)度限制為 1024 個(gè)字符。 |
error_types |
可選。規(guī)定錯(cuò)誤消息的錯(cuò)誤類型。 可能的值:
|
/** * * @param type $level * @param type $msg */ function my_error($level, $msg) { switch ($level) { case E_USER_ERROR: echo "ERROR:<br/>"; break; case E_USER_WARNING: echo "WARNING:<br/>"; break; case E_USER_NOTICE: echo "NOTICE:<br/>"; break; default: break; } echo "錯(cuò)誤編號(hào):" . $level . " <br/>"; echo "錯(cuò)誤信息:" . $msg; } //注冊(cè)錯(cuò)誤處理器 set_error_handler('my_error'); if (89 > 8) { //調(diào)用錯(cuò)誤觸發(fā)器 trigger_error('這是錯(cuò)誤啊', E_USER_WARNING); }
運(yùn)行結(jié)果如下:
WARNING:
錯(cuò)誤編號(hào):512
錯(cuò)誤信息:這是錯(cuò)誤啊
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的運(yùn)行環(huán)境
這篇文章主要介紹了在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的運(yùn)行環(huán)境,需要的朋友可以參考下2016-04-04PHP解析目錄路徑的3個(gè)函數(shù)總結(jié)
這篇文章主要介紹了PHP解析目錄路徑的3個(gè)函數(shù)總結(jié),本文總結(jié)了basename、dirname、pathinfo3個(gè)函數(shù),它們分別處理路徑的不同部分,需要的朋友可以參考下2014-11-11php+mysql+jquery實(shí)現(xiàn)簡(jiǎn)易的檢索自動(dòng)補(bǔ)全提示功能
這篇文章主要介紹了php+mysql+jquery實(shí)現(xiàn)簡(jiǎn)易的檢索自動(dòng)補(bǔ)全提示功能,涉及基于jQuery的ajax數(shù)據(jù)庫查詢與事件動(dòng)態(tài)響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-04-04php面向?qū)ο蟪绦蛟O(shè)計(jì)中self與static的區(qū)別分析
這篇文章主要介紹了php面向?qū)ο蟪绦蛟O(shè)計(jì)中self與static的區(qū)別,結(jié)合實(shí)例形式分析了php面向?qū)ο蟪绦蛟O(shè)計(jì)中self與static的功能、以及在繼承過程中實(shí)現(xiàn)多態(tài)的區(qū)別,并總結(jié)了static靜態(tài)延遲綁定的原理,需要的朋友可以參考下2019-05-05