標籤:sch ice lte stat dha vax rpd cap mat
錯誤的分類
通常分3種:
語法錯誤:
程式運行之前,都要先檢查文法。如果文法有錯誤,就會立即報錯,並且不會去執行程式。
執行階段錯誤:
就是在程式語法檢查通過後,,開始運行程式並在此過程中遇到的錯誤。常見的有3中:
提示性錯誤:
警告性錯誤:
致命錯誤:
邏輯錯誤:
指的是,程式本身可以正常執行,沒有報錯——但“計算結果”卻錯了。
錯誤的分級
php語言中,將各種錯誤進行了不同層級的分類歸納,並形成大約有10幾個層級的錯誤,這就是技術層面的錯誤分級。
每一層級的錯誤,都有一個“代號”,這個代號其實也就是一個系統內部的“常量而已”。比如:
系統常見錯誤:
E_ERROR: 致命錯誤
E_WARNING: 警告性錯誤
E_NOTICE: 提示性錯誤
使用者可自訂的錯誤:
E_USER_ERROR: 自訂致命錯誤
E_USER_WARNING: 自訂警告性錯誤
E_USER_NOTICE: 自訂提示性錯誤
其他:
E_STRICT: 嚴謹性語法檢查錯誤
E_ALL 代表“所有錯誤”。
詳細參考手冊:
下面來看看這些錯誤代號的實際值:
運行結果為:
錯誤的觸發
錯誤的觸發,就是讓錯誤“發生”。
有兩種方式會觸發錯誤:
系統觸發
程式運行到某行代碼,確實出現了某種錯誤,此時系統就會報錯——這就是觸發了系統錯誤。
系統觸發的典型錯誤有這3種:
E_NOTICE: 提示性錯誤:會輸出錯誤提示,並繼續執行後續代碼;
比如使用不存在的變數或常量:
E_WARNING: 警告性錯誤:會輸出錯誤提示,並繼續執行後續代碼(也可能看具體情況,比如require)
比如include載入一個不存在的檔案:
E_ERROR: 致命錯誤:導致程式無法執行後續語句;
比如調用一個不存在的函數!
自訂觸發:
當我們處理某些資料的時候,本來資料本身是沒有錯誤的,但根據具體應用(業務)的需要,會要求資料滿足某種條件,而該資料並不滿足的時候,我們就可以在程式中“主動”去觸發(建立)一個錯誤,以表明該資料的“非法性”。
文法形式:
trigger_error(“錯誤提示資訊內容”, 3中使用者錯誤代號之一);
其中觸發了使用者的致命錯誤(E_USER_ERROR),也會終止程式的後續執行。
錯誤報表的顯示問題
所謂錯誤報表,就是顯示在網頁上的錯誤提示內容!
有關錯誤報表,有2個問題需要處理:
是否顯示錯誤報表(display_errors):
有2種做法可以來設定是否顯示:
做法1:
在php.ini檔案中,設定display_erros的值,為on(顯示),或為off(不顯示)
可以修改為:
當然,作為開發階段,我們都應該顯示錯誤資訊。
注意:前提條件都是我們apache已經裝載了php.ini檔案——這一點,需要在apache的設定檔httpd.config中加入如下一行:
PHPIniDir “php.ini檔案的了位置(路徑)”
比如:
方法2:
直接在php的指令檔中設使用函數ini_set()來對其進行設定:
當然,如果設定為1,就是顯示!
注意:
1,不管哪種形式,該單詞是一樣的:display:errors
2,使用php.ini配置,影響的是全域(即所有php網頁);
3,在某個指令碼代碼中使用ini_set()設定,就隻影響該指令碼代碼本身——這是常用的方式。
4,指令碼中的設定優先於php.ini中的設定。
顯示哪些層級的錯誤報表(error_reporting):
顯然,前提是“display_errors”設定為On(或1),表示可以顯示。
顯示哪些層級的錯誤報表,也有2個做法:
做法1:在php.ini檔案中;
這個值目前代表“所有錯誤”,都顯示。
修改為:
更多樣本為:
error_reporting = E_NOTICE | E_WARING | E_ERROR //顯示該3種;
error_reporting = E_ERROR | E_USER_ERROR //顯示該2種嚴重錯誤
要想代表真正的“所有錯誤”,應該寫為:E_ERROR | E_STRICT,圖示如下:
做法2:在當前的指令碼代碼中:
跟php.ini中設定其實是一樣,舉一些例子如下:
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配置項”, 值); //用於指令碼中設定php.ini中是某項的值。
2,:$v1 = ini_get(“php配置項”); //用於擷取php.ini中是某項的值
記錄到哪裡error_log:
一般就只有2個寫法:
寫法1:直接使用一個檔案名稱,此時系統會自動在每個檔案夾下都建立該檔案名稱,並用其記錄該檔案夾下的所有網頁檔案發生的錯誤資訊。
然後執行一個有錯誤的網頁,並可以觀察到:
其中的內容大約為:
寫法2:使用一個特殊的名字“syslog”,則此時所有錯誤資訊都會記錄到系統的“記錄檔”中。
系統記錄檔在這裡:控制台》管理工具》事件檢視器》window日誌》應用程式:
自訂錯誤處理器
什麼叫錯誤處理器?
就是一旦發生錯誤,用來處理該錯誤的一種“機器”——其實就是一個函數。
自訂錯誤處理,就是指:
讓系統不要去處理錯誤了,而完全由我們(開發人員)來對錯誤進行處理:顯示和記錄。
做法,其實非常簡單,就2步:
第一步:
設定要用於處理錯誤的函數名!
set_error_handler(“f1”);
第二步:
去定義該函數!
function f1(){
//這裡可以任意寫代碼:自然正常是去顯示錯誤報表,和記錄錯誤記錄檔。
}
php錯誤的處理