PHP中错误处理集合
PHP錯誤處理
錯誤的分類
通常分3種:
?
語法錯誤:
程序運行之前,都要先檢查語法。如果語法有錯誤,就會立即報錯,并且不會去執(zhí)行程序。
?
運行時錯誤:
就是在程序語法檢查通過后,,開始運行程序并在此過程中遇到的錯誤。常見的有3中:
提示性錯誤:
警告性錯誤:
致命錯誤:
?
邏輯錯誤:
指的是,程序本身可以正常執(zhí)行,沒有報錯——但"計算結(jié)果"卻錯了。
?
錯誤的分級
php語言中,將各種錯誤進(jìn)行了不同級別的分類歸納,并形成大約有10幾個級別的錯誤,這就是技術(shù)層面的錯誤分級。
每一級別的錯誤,都有一個"代號",這個代號其實也就是一個系統(tǒng)內(nèi)部的"常量而已"。比如:
?
系統(tǒng)常見錯誤:
E_ERROR:????????致命錯誤
E_WARNING:????警告性錯誤
E_NOTICE:????????提示性錯誤
用戶可自定義的錯誤:
E_USER_ERROR:????????自定義致命錯誤
E_USER_WARNING:????????自定義警告性錯誤
E_USER_NOTICE:????????自定義提示性錯誤
其他:
E_STRICT:????????嚴(yán)謹(jǐn)性語法檢查錯誤
E_ALL????????????代表"所有錯誤"。
?
詳細(xì)參考手冊:
?
?
下面來看看這些錯誤代號的實際值:
運行結(jié)果為:
?
錯誤的觸發(fā)
錯誤的觸發(fā),就是讓錯誤"發(fā)生"。
有兩種方式會觸發(fā)錯誤:
?
系統(tǒng)觸發(fā)
程序運行到某行代碼,確實出現(xiàn)了某種錯誤,此時系統(tǒng)就會報錯——這就是觸發(fā)了系統(tǒng)錯誤。
系統(tǒng)觸發(fā)的典型錯誤有這3種:
E_NOTICE:????????提示性錯誤:會輸出錯誤提示,并繼續(xù)執(zhí)行后續(xù)代碼;
比如使用不存在的變量或常量:
?
E_WARNING:????警告性錯誤:會輸出錯誤提示,并繼續(xù)執(zhí)行后續(xù)代碼(也可能看具體情況,比如require)
比如include載入一個不存在的文件:
E_ERROR:????????致命錯誤:導(dǎo)致程序無法執(zhí)行后續(xù)語句;
比如調(diào)用一個不存在的函數(shù)!
自定義觸發(fā):
當(dāng)我們處理某些數(shù)據(jù)的時候,本來數(shù)據(jù)本身是沒有錯誤的,但根據(jù)具體應(yīng)用(業(yè)務(wù))的需要,會要求數(shù)據(jù)滿足某種條件,而該數(shù)據(jù)并不滿足的時候,我們就可以在程序中"主動"去觸發(fā)(創(chuàng)建)一個錯誤,以表明該數(shù)據(jù)的"非法性"。
語法形式:
trigger_error("錯誤提示信息內(nèi)容", 3中用戶錯誤代號之一);
其中觸發(fā)了用戶的致命錯誤(E_USER_ERROR),也會終止程序的后續(xù)執(zhí)行。
?
錯誤報告的顯示問題
所謂錯誤報告,就是顯示在網(wǎng)頁上的錯誤提示內(nèi)容!
?
有關(guān)錯誤報告,有2個問題需要處理:
?
是否顯示錯誤報告(display_errors):
有2種做法可以來設(shè)定是否顯示:
做法1:
在php.ini文件中,設(shè)定display_erros的值,為on(顯示),或為off(不顯示)
可以修改為:
當(dāng)然,作為開發(fā)階段,我們都應(yīng)該顯示錯誤信息。
?
注意:前提條件都是我們apache已經(jīng)裝載了php.ini文件——這一點,需要在apache的配置文件httpd.config中加入如下一行:
PHPIniDir "php.ini文件的了位置(路徑)"
比如:
?
方法2:
直接在php的腳本文件中設(shè)使用函數(shù)ini_set()來對其進(jìn)行設(shè)置:
當(dāng)然,如果設(shè)置為1,就是顯示!
?
注意:
1,不管哪種形式,該單詞是一樣的:display:errors
2,使用php.ini配置,影響的是全局(即所有php網(wǎng)頁);
3,在某個腳本代碼中使用ini_set()設(shè)置,就只影響該腳本代碼本身——這是常用的方式。
4,腳本中的設(shè)置優(yōu)先于php.ini中的設(shè)置。
?
顯示哪些級別的錯誤報告(error_reporting):
顯然,前提是"display_errors"設(shè)置為On(或1),表示可以顯示。
?
顯示哪些級別的錯誤報告,也有2個做法:
做法1:在php.ini文件中;
這個值目前代表"所有錯誤",都顯示。
修改為:
此時就只顯示E_NOTICE級別的錯誤
更多示例為:
error_reporting = E_NOTICE | E_WARING | E_ERROR????????//顯示該3種;
error_reporting = E_ERROR | E_USER_ERROR????????????????//顯示該2種嚴(yán)重錯誤
要想代表真正的"所有錯誤",應(yīng)該寫為:E_ERROR | E_STRICT,圖示如下:
?
做法2:在當(dāng)前的腳本代碼中:
跟php.ini中設(shè)置其實是一樣,舉一些例子如下:
ini_set("error_reporting", E_NOTICE);????//就顯示該一個級別的錯誤
ini_set("error_reporting", E_NOTICE | E_WARNING),????//顯示2個級別
ini_set("error_reporting", E_NOTICE | E_WARNING | E_ERROR),????//顯示3個級別
ini_set("error_reporting", E_ALL | E_STRICT),????//這才代表顯示所有錯誤!
?
錯誤日志的記錄問題
錯誤日志其實就是錯誤報告,只是它會"寫入文件中",此時就稱為錯誤日志!
?
也有2個問題,每個問題也有2種做法:
?
是否記錄log_errors:
php.ini中:
log_errors = On 或 Off
?
腳本中:
ini_set("log_erros", 1); 或 0
?
補充一句:
1:ini_set("php配置項", 值);????//用于腳本中設(shè)置php.ini中是某項的值。
2,:$v1 = ini_get("php配置項");????//用于獲取php.ini中是某項的值
?
記錄到哪里error_log:
一般就只有2個寫法:
寫法1:直接使用一個文件名,此時系統(tǒng)會自動在每個文件夾下都建立該文件名,并用其記錄該文件夾下的所有網(wǎng)頁文件發(fā)生的錯誤信息。
然后執(zhí)行一個有錯誤的網(wǎng)頁,并可以觀察到:
其中的內(nèi)容大約為:
?
?
寫法2:使用一個特殊的名字"syslog",則此時所有錯誤信息都會記錄到系統(tǒng)的"日志文件"中。
系統(tǒng)日志文件在這里:控制面板》管理工具》事件查看器》window日志》應(yīng)用程序:
?
然后執(zhí)行一個有錯誤的網(wǎng)頁,并可以觀察到:
?
?
自定義錯誤處理器
什么叫錯誤處理器?
就是一旦發(fā)生錯誤,用來處理該錯誤的一種"機器"——其實就是一個函數(shù)。
?
自定義錯誤處理,就是指:
讓系統(tǒng)不要去處理錯誤了,而完全由我們(開發(fā)者)來對錯誤進(jìn)行處理:顯示和記錄。
?
做法,其實非常簡單,就2步:
?
第一步:
設(shè)定要用于處理錯誤的函數(shù)名!
set_error_handler("f1");
第二步:
去定義該函數(shù)!
function f1(){
//這里可以任意寫代碼:自然正常是去顯示錯誤報告,和記錄錯誤日志。
}
?
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的PHP中错误处理集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程间的通信方式1--共享变量(内存)
- 下一篇: libuuid 安装