目錄:
一、前言
二、錯誤級別
三、自定義PHP中的錯誤處理方法
四、自定義異常處理
一、前言:
PHP中的錯誤是什么:
由於php腳本自身的問題,大部分情況是由錯誤的語法,服務器環境導致,使得編譯器無法通過檢查,甚至無法運行的情況。像warning、notice、fatal 都是錯誤,只是他們的級別不同而已,並且錯誤是不能被try-catch捕獲的。
在寫PHP程序時,我們基本上使用的是PHP語言中系統自定義的報錯方式,例如
例1:在PHP安裝目錄中查找並打開配置文件php.ini,設置display_errors的值
刪除前面的分號,並設置值為on
例2:在PHP代碼中設置
ini_set('error_reporting', E_ALL );
ini_set('display_errors', 'on' );
附上error_reporting所有參數定義
參數 |
說明 |
---|---|
error_reporting(0) |
關閉錯誤報告 |
error_reporting(E_ERROR | E_WARNING | E_PARSE) |
報告 runtime 錯誤 |
error_reporting(E_ALL) |
報告所有錯誤 |
ini_set("error_reporting", E_ALL) |
等同 error_reporting(E_ALL) |
error_reporting(E_ALL & ~E_NOTICE) |
報告 E_NOTICE 之外的所有錯誤 |
二、錯誤級別
級別 |
具體值 |
---|---|
Fatal Error 致命錯誤(腳本終止運行) |
E_ERROR // 致命的運行錯誤,錯誤無法恢復,暫停執行腳本 E_CORE_ERROR // PHP啟動時初始化過程中的致命錯誤 E_COMPILE_ERROR // 編譯時致命性錯,就像由Zend腳本引擎生成了一個E_ERROR E_USER_ERROR // 自定義錯誤消息。像用PHP函數trigger_error(錯誤類型設置為:E_USER_ERROR) |
Parse Error 編譯時解析錯誤,語法錯誤(腳本終止運行) |
E_PARSE //編譯時的語法解析錯誤 |
Warning Error 警告錯誤(僅給出提示信息,腳本不終止運行) |
E_WARNING // 運行時警告 (非致命錯誤)。 E_CORE_WARNING // PHP初始化啟動過程中發生的警告 (非致命錯誤) 。 E_COMPILE_WARNING // 編譯警告 E_USER_WARNING // 用戶產生的警告信息 |
Notice Error 通知錯誤(僅給出通知信息,腳本不終止運行) |
E_NOTICE // 運行時通知。表示腳本遇到可能會表現為錯誤的情況. E_USER_NOTICE // 用戶產生的通知信息。 |
具體值中對應的數字ID
ID |
級別 |
描述 |
---|---|---|
1 | E_ERROR | 運行時致命的錯誤。不能修復的錯誤。停止執行腳本。 |
2 | E_WARNING | 運行時非致命的錯誤。沒有停止執行腳本。 |
4 | E_PARSE | 編譯時的解析錯誤。解析錯誤應該只由解析器生成。 |
8 | E_NOTICE | 運行時的通知。腳本發現可能是一個錯誤,但也可能在正常運行腳本時發生。 |
16 | E_CORE_ERROR | PHP 啟動時的致命錯誤。這就如同 PHP 核心的 E_ERROR。 |
32 | E_CORE_WARNING | PHP 啟動時的非致命錯誤。這就如同 PHP 核心的 E_WARNING。 |
64 | E_COMPILE_ERROR | 編譯時致命的錯誤。這就如同由 Zend 腳本引擎生成的 E_ERROR。 |
128 | E_COMPILE_WARNING | 編譯時非致命的錯誤。這就如同由 Zend 腳本引擎生成的 E_WARNING。 |
256 | E_USER_ERROR | 用戶生成的致命錯誤。這就如同由程序員使用 PHP 函數 trigger_error() 生成的 E_ERROR。 |
512 | E_USER_WARNING | 用戶生成的非致命錯誤。這就如同由程序員使用 PHP 函數 trigger_error() 生成的 E_WARNING。 |
1024 | E_USER_NOTICE | 用戶生成的通知。這就如同由程序員使用 PHP 函數 trigger_error() 生成的 E_NOTICE。 |
2048 | E_STRICT | 運行時的通知。PHP 建議您改變代碼,以提高代碼的互用性和兼容性。 |
4096 | E_RECOVERABLE_ERROR | 可捕獲的致命錯誤。這就如同一個可以由用戶定義的句柄捕獲的 E_ERROR(見 set_error_handler())。 |
6143 | E_ALL | 所有的錯誤和警告的級別,除了 E_STRICT(自 PHP 6.0 起,E_STRICT 將作為 E_ALL的一部分)。 |
三、自定義PHP中的錯誤處理方法
1:set_error_handler()
set_error_handler(errorhandler,E_ALL|E_STRICT);
參數 |
描述 |
---|---|
errorhandler | 必需。規定用戶錯誤處理函數的名稱。 |
E_ALL|E_STRICT | 可選。規定顯示何種錯誤報告級別的用戶定義錯誤。默認是 "E_ALL"。 |
PHP手冊中 errorhandler 的描述:
看代碼:
輸出:
按照系統報錯的格式改造一下:
輸出:
說明:
調用 set_error_handler() 時需要注意是,
第一,如果存在該方法,相應的error_reporting()就不能在使用了,所有的錯誤都會交給自定義的函數處理。
第二,該函數只能捕獲系統產生的一些Warning、Notice級別的錯誤。
2:register_shutdown_function()
說明:
register_shutdown_function可以捕獲Fatal Error、Parse Error等,這個方法是PHP腳本執行結束前最后一個調用的函數,比如腳本錯誤、die()、exit、異常、正常結束都會調用。
通過這個函數就可以在腳本結束前判斷這次執行是否有錯誤產生,這時就要借助於一個函數:error_get_last();這個函數可以拿到本次執行產生的錯誤。
看代碼:
輸出:
改造一下:
輸出:
四、自定義異常處理
什么是異常:
程序在運行中出現不符合預期的情況或與正常流程不同的情況。一種不正常的情況,按照正常邏輯不該出現,但在寫代碼時仍然會出現的想不到情況,這是屬於邏輯和業務流程的錯誤,
而不是編譯或者語法上的錯誤。
引入Exception異常處理類:
說明:異常處理的加入使得在 PHP 程序中排查錯誤、捕獲異常更加簡單容易,也使得 PHP 程序在健壯性方面有很大改善和提高。異常處理在 PHP 中的具體體現就是,PHP 提供了一
個名叫 Exception 的類完成對 PHP 程序異常的處理,這個類包含了一些處理異常的函數,這些函數可以捕獲程序異常和錯誤。
PHP異常處理(Exception)
例1:使用 try catch 捕獲程序中的異常
說明:
示例代碼中,在 try 語句塊中試着判斷當前目錄下是否存在名為 test 的目錄,如果不存在這個目錄,那么就會執行else的代碼,通過關鍵字 throw 拋出異常。
這個異常是一個 Exception 類的對象,通過 new 關鍵字生成,並且用自定義的錯誤信息 $msg和錯誤代碼 $code 初始化該對象,用於后面 catch 異常時獲取這些信息。
一旦拋出異常,那么 try 語句塊中剩下的代碼就不再繼續執行,程序流程轉至相應的 catch 語句塊執行,最終通過 Exception 對象調用其成員函數輸出錯誤信息和代碼。
2:set_exception_handler()
說明:函數set_exception_handler()接受一個函數名作為參數,該函數名對應的函數稱為異常處理回調函數,它在有異常發生但無代碼捕獲時被自動調用。被調用之后程序立即終止。
代碼實現:
輸出: