您好,登錄后才能下訂單哦!
PHP錯誤處理
錯誤的分類:
語法錯誤:程序沒法運行,直接提示語法錯誤
運行時錯誤:只有程序運行到某行,或在某此特定的情形下運行才會發(fā)生的錯誤。
邏輯錯誤:程序從頭到尾運行都沒有發(fā)生(并提示)錯誤,但程序運行計算的結(jié)果是錯誤的。
程序員主要面對的和要處理的錯誤,就是運行時錯誤。
錯誤的分級:
在php中,將各種錯誤,分門別類,依據(jù)不同的嚴重程序和產(chǎn)生的來源(機制),將各種錯誤分為大約十幾個級別。
每個級別的錯誤,都對應(yīng)一個內(nèi)部的名稱--系統(tǒng)常量!
系統(tǒng)錯誤:
E_ERROR 系統(tǒng)嚴重錯誤 (一發(fā)生,程序立即停止執(zhí)行。該錯誤一般希望馬上解決)
E_WARNING 系統(tǒng)警告 (一發(fā)生,提示錯誤,并繼續(xù)執(zhí)行。通常該錯誤希望能夠在“下一工作日”去處理掉)
E_PARSE 語法錯誤 (一發(fā)生,提示錯誤,而且代碼完全不會運行--在運行之前先檢查語法。)
E_NOTICE 系統(tǒng)提示 (一發(fā)生,提示錯誤,并繼續(xù)執(zhí)行。發(fā)個郵件通知下,自己安排時間有空去解決。)
它們的本質(zhì)是什么呢?
echo "<br />E_ERROR = ".E_ERROR;
echo "<br />E_WARNING = ".E_WARNING;
echo "<br />E_PARSE = ".E_PARSE;
echo "<br />E_NOTICE = ".E_NOTICE;
輸出的結(jié)果分別為:
E_ERROR = 1
E_WARNING = 2
E_PARSE = 4
E_NOTICE = 8
可見它們只是一個系統(tǒng)內(nèi)部的常量(整數(shù)常量);實際上,這些常量(代號)是供我們對該類錯誤進行“控制”的標示符而已。
用戶自定義錯誤:
只有三個:
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
我們可以在程序中,自己創(chuàng)建(生成)錯誤 -- 是為了針對某些數(shù)據(jù)的不合理情形而創(chuàng)建的錯誤
比如:讓用戶填寫年齡,填18是OK,但填寫188,則就是不合理 -- 從數(shù)字角度本身是沒有問題的
其它錯誤:
E_ALL 代表所有錯誤 -- 表示它可以“包括”所有錯誤。
E_STRICT 代表“嚴格性”語法檢查錯誤 -- 某種語法是可以執(zhí)行的,但在當前的php版本是不歡迎使用。
錯誤的觸發(fā):
正常觸發(fā):程序運行時確實發(fā)生了運行錯誤 -- 也可能是語法檢查錯誤
三種常見的運行時錯誤:
人工觸發(fā):
就是由程序員通過程序代碼而“產(chǎn)生”一個錯誤
語法:
trigger_errer("錯誤提示",用戶錯誤代號);
應(yīng)用中,通常是需要檢測(判斷)數(shù)據(jù)的有效性,以決定是否觸發(fā)相應(yīng)錯誤,比如:
錯誤的顯示控制:
網(wǎng)頁中顯示(提示)錯誤信息,是可以進行控制的,有兩種途徑:
1:在php.ini文件中設(shè)定,對所有php程序都有效
2:在當前腳本文件中,只對當前腳本文件有效
錯誤的顯示有2個方面可以進行控制:
1:設(shè)定是否顯示:display_error
php.ini中控制:display_error = on; //表示顯示,off表示不顯示
腳本中:ini_set("display_error",1); //1表示顯示,0表示不顯示,也可以用true or false
腳本中的設(shè)定優(yōu)先級高,但只對當前文件有效。
2:設(shè)定顯示哪些級別的錯誤 -- 依賴與第一項設(shè)定為顯示的情況
php.ini文件中:
error_reporting = E_NOTICE; //只顯示E_NOTICE錯誤
error_reporting = E_NOTICE | E_WARNING //顯示E_NOTICE 和 E_WARNING
error_reporting = E_NOTICE | E_WARNING | E_ERROR //顯示E_NOTICE 和 E_WARNING 和 E_ERROR
ini_set()含義可以設(shè)定幾乎所有php.ini中的設(shè)定項,形式如下:
ini_set("設(shè)定項名稱",值); //這種設(shè)定都只對當前腳本有效,而且無需重啟apache,很方便
另一個對應(yīng)函數(shù)是:int_get("設(shè)定項名稱"); //用于獲取某項的值。
記錄錯誤日志:
在開發(fā)階段,我們通常都是顯示所有錯誤 -- 意圖解決錯誤
在產(chǎn)品階段,我們通常都是隱藏所有錯誤 -- 并同時將錯誤信息記錄到文件中--錯誤日志文件
我們可以自己查看錯誤日志以解決開發(fā)階段沒有發(fā)現(xiàn)的錯誤問題
記錄錯誤日志同樣有2種途徑:
1:在php.ini文件中設(shè)定
log_errors = on; //用于設(shè)定是否記錄錯誤日志,on or off
error_log = "錯誤日志文件名"; 如:error_log = php_errors.log
此時,該文件沒有給定路徑,則系統(tǒng)會在每個文件夾下建立該文件并記錄
error_log還有一個特殊值可以使用:error_log = syslog; 表示不會記錄錯誤日志文件,而是把錯誤信息寫入到系統(tǒng)錯誤日志中
2:在當前腳本文件中
ini_set("log_errors",On); //or Off
ini_set("error_log",'err1.log');
ini_set("error_log",'err2.txt');
ini_set("error_log",'err3.html');
ini_set("error_log",'syslog); //記錄到操作系統(tǒng)日志中
自定義錯誤處理:
以上的錯誤處理,不管是顯示錯誤,還是記錄錯誤日志,都是php語言內(nèi)部實現(xiàn)的。
我們只是幾個簡單的設(shè)定是否顯示或是否記錄或顯示哪些,或記錄到哪里。
則:
自定義錯誤處理,就可以讓我們自己完全控制錯誤的提示內(nèi)容!
做法非常簡單:
1:設(shè)定要來運行自定義處理錯誤的函數(shù)名;
2:自己去定義該函數(shù),并在其中進行任何錯誤信息的輸出
這兩件事做好后,一旦發(fā)生錯誤,則系統(tǒng)就會調(diào)用該 函數(shù)去執(zhí)行里面的代碼
設(shè)定錯誤由我們自定義函數(shù)來處理:set_error_handler("函數(shù)名");
定義該函數(shù),帶4個參數(shù):function errorHandler($errNo,$errMsg,$errFile,$errLine) {......}
注意:上述自定義處理函數(shù)中,只做了“顯示錯誤”的工作,而沒有做“記錄錯誤日志”的工作。這需要后續(xù)“操作文件”的知識。
測試代碼:
則界面顯示結(jié)果:
幾點說明:
1:一般是用自定義錯誤處理程序,則系統(tǒng)不再處理錯誤
2:如果一旦發(fā)生嚴重錯誤(E_ERROR , E_USER_ERROR),則立即停止程序,并也不去調(diào)用自定義錯誤處理函數(shù) -- 此時系統(tǒng)錯誤處理工作照常進行 -- 即對于嚴重錯誤,自定義函數(shù)處理不了。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。