php錯誤的處理

來源:互聯網
上載者:User

標籤: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錯誤的處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.