PHP錯誤和異常處理


目錄:

一、前言

二、錯誤級別

三、自定義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()接受一個函數名作為參數,該函數名對應的函數稱為異常處理回調函數,它在有異常發生但無代碼捕獲時被自動調用。被調用之后程序立即終止。

代碼實現:

 

 

輸出:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM