PHP錯誤處理
錯誤的分類:
語法錯誤:程序沒法運行,直接提示語法錯誤
運行時錯誤:只有程序運行到某行,或在某此特定的情形下運行才會發生的錯誤。
邏輯錯誤:程序從頭到尾運行都沒有發生(并提示)錯誤,但程序運行計算的結果是錯誤的。
程序員主要面對的和要處理的錯誤,就是運行時錯誤。
錯誤的分級:
在php中,將各種錯誤,分門別類,依據不同的嚴重程序和產生的來源(機制),將各種錯誤分為大約十幾個級別。
每個級別的錯誤,都對應一個內部的名稱--系統常量!
系統錯誤:
E_ERROR 系統嚴重錯誤 (一發生,程序立即停止執行。該錯誤一般希望馬上解決)
E_WARNING 系統警告 (一發生,提示錯誤,并繼續執行。通常該錯誤希望能夠在“下一工作日”去處理掉)
E_PARSE 語法錯誤 (一發生,提示錯誤,而且代碼完全不會運行--在運行之前先檢查語法。)
E_NOTICE 系統提示 (一發生,提示錯誤,并繼續執行。發個郵件通知下,自己安排時間有空去解決。)
它們的本質是什么呢?
echo "<br />E_ERROR = ".E_ERROR;
echo "<br />E_WARNING = ".E_WARNING;
echo "<br />E_PARSE = ".E_PARSE;
echo "<br />E_NOTICE = ".E_NOTICE;
輸出的結果分別為:
E_ERROR = 1
E_WARNING = 2
E_PARSE = 4
E_NOTICE = 8
可見它們只是一個系統內部的常量(整數常量);實際上,這些常量(代號)是供我們對該類錯誤進行“控制”的標示符而已。
用戶自定義錯誤:
只有三個:
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
我們可以在程序中,自己創建(生成)錯誤 -- 是為了針對某些數據的不合理情形而創建的錯誤
比如:讓用戶填寫年齡,填18是OK,但填寫188,則就是不合理 -- 從數字角度本身是沒有問題的
其它錯誤:
E_ALL 代表所有錯誤 -- 表示它可以“包括”所有錯誤。
E_STRICT 代表“嚴格性”語法檢查錯誤 -- 某種語法是可以執行的,但在當前的php版本是不歡迎使用。
錯誤的觸發:
正常觸發:程序運行時確實發生了運行錯誤 -- 也可能是語法檢查錯誤
三種常見的運行時錯誤:
人工觸發:
就是由程序員通過程序代碼而“產生”一個錯誤
語法:
trigger_errer("錯誤提示",用戶錯誤代號);

應用中,通常是需要檢測(判斷)數據的有效性,以決定是否觸發相應錯誤,比如:

錯誤的顯示控制:
網頁中顯示(提示)錯誤信息,是可以進行控制的,有兩種途徑:
1:在php.ini文件中設定,對所有php程序都有效
2:在當前腳本文件中,只對當前腳本文件有效
錯誤的顯示有2個方面可以進行控制:
1:設定是否顯示:display_error
php.ini中控制:display_error = on; //表示顯示,off表示不顯示
腳本中:ini_set("display_error",1); //1表示顯示,0表示不顯示,也可以用true or false
腳本中的設定優先級高,但只對當前文件有效。
2:設定顯示哪些級別的錯誤 -- 依賴與第一項設定為顯示的情況
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()含義可以設定幾乎所有php.ini中的設定項,形式如下:
ini_set("設定項名稱",值); //這種設定都只對當前腳本有效,而且無需重啟apache,很方便
另一個對應函數是:int_get("設定項名稱"); //用于獲取某項的值。
記錄錯誤日志:
在開發階段,我們通常都是顯示所有錯誤 -- 意圖解決錯誤
在產品階段,我們通常都是隱藏所有錯誤 -- 并同時將錯誤信息記錄到文件中--錯誤日志文件
我們可以自己查看錯誤日志以解決開發階段沒有發現的錯誤問題
記錄錯誤日志同樣有2種途徑:
1:在php.ini文件中設定
log_errors = on; //用于設定是否記錄錯誤日志,on or off
error_log = "錯誤日志文件名"; 如:error_log = php_errors.log
此時,該文件沒有給定路徑,則系統會在每個文件夾下建立該文件并記錄
error_log還有一個特殊值可以使用:error_log = syslog; 表示不會記錄錯誤日志文件,而是把錯誤信息寫入到系統錯誤日志中
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); //記錄到操作系統日志中
自定義錯誤處理:
以上的錯誤處理,不管是顯示錯誤,還是記錄錯誤日志,都是php語言內部實現的。
我們只是幾個簡單的設定是否顯示或是否記錄或顯示哪些,或記錄到哪里。
則:
自定義錯誤處理,就可以讓我們自己完全控制錯誤的提示內容!
做法非常簡單:
1:設定要來運行自定義處理錯誤的函數名;
2:自己去定義該函數,并在其中進行任何錯誤信息的輸出
這兩件事做好后,一旦發生錯誤,則系統就會調用該 函數去執行里面的代碼
設定錯誤由我們自定義函數來處理:set_error_handler("函數名");
定義該函數,帶4個參數:function errorHandler($errNo,$errMsg,$errFile,$errLine) {......}

注意:上述自定義處理函數中,只做了“顯示錯誤”的工作,而沒有做“記錄錯誤日志”的工作。這需要后續“操作文件”的知識。
測試代碼:

則界面顯示結果:

幾點說明:
1:一般是用自定義錯誤處理程序,則系統不再處理錯誤
2:如果一旦發生嚴重錯誤(E_ERROR , E_USER_ERROR),則立即停止程序,并也不去調用自定義錯誤處理函數 -- 此時系統錯誤處理工作照常進行 -- 即對于嚴重錯誤,自定義函數處理不了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。