詳解php7中異常與錯誤的處理
首先聲明,筆者php版本7.2
- #異常與錯誤的概述
- 什麼叫做異常?
- 什麼叫做錯誤?
- 異常處理
- 錯誤的層級
- 自訂錯誤處理程序
- set_error_handler()
- set_exception_handler()
- #register_shutdown_function()
- 框架的錯誤處理
- #異常與錯誤的概述
推薦(免費):PHP7
#異常與錯誤的概述
#什麼叫做異常?
異常是指程式運作中不符合預期情況以及與正常流程不同的狀況。
例如你連結資料庫,在參數都寫上去的條件下,發現連結不上去,這就屬於不符合預期
可以被try-catch 捕捉得到
什麼叫做錯誤?
是屬於php程式本身的問題,一般是由非法的語法,環境問題導致的,使得編譯器無法通過檢查,甚至無法運作的情況。
平常遇到的 warming、notice都是錯誤,只是等級不同而已。
例如:
- TypeError(類型錯誤) 我規定的函數參數類型和傳入的參數不一致
- ArithmeticError (算數錯誤)
- ParseError (解析錯誤)在調入的檔案中,include “demo.php”,或eval();中有語法錯誤造成解析失敗
- AssertionError(斷言錯誤)當assert生效時產生該錯誤
- pisionByZeroError (分母為零) 運算過程中例如除法,分母為0
除了這幾種情況,其餘全部為異常
#異常處理
在先前的php5.X 中並且不能被try-catch 捕捉得到,到了php 7.x 中,定義了一個Throwable 接口並使得大部分的Error 和
Exception 實現了該接口,我們得以在try-catch 中拋出該錯誤
所以說以後想要捕獲異常,而你又不知道此異常是Error 還是Exception 的話,可以向這樣拋出
try{ …… }catch(Throwable $e){ …… }
#錯誤的等級
在php 中的錯誤也是有等級的
Parse error
>Fatal Error
> Waning
> Notice
>Deprecated
Deprecated 最低级别的错误(不推荐,不建议) 使用一些过期函数的时候会出现,程序继续执行 Notice 通知级别的错误 使用一些未定义变量、常量或者数组key没有加引号的时候会出现,程序继续执行 E_NOTICE // 运行时通知。表示脚本遇到可能会表现为错误的情况. E_USER_NOTICE // 用户产生的通知信息。Waning 警告级别的错误 程序出问题了,需要修改代码!!!程序继续执行 E_WARNING // 运行时警告 (非致命错误)。 E_CORE_WARNING // PHP初始化启动过程中发生的警告 (非致命错误) 。 E_COMPILE_WARNING // 编译警告 E_USER_WARNING // 用户产生的警告信息Fatal Error 错误级别的错误 程序直接报错,需要修改代码!!!中断程序执行,可使用register_shutdown_function()函数在程序终止前触发一个函数 E_ERROR // 致命的运行错误,错误无法恢复,暂停执行脚本 E_CORE_ERROR // PHP启动时初始化过程中的致命错误 E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR E_USER_ERROR // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)Parse error 语法解析错误 语法检查阶段报错,需要修改代码!!!中断程序执行,除了修改ini文件,将错误信息写到日志中,什么也做不了 E_PARSE //编译时的语法解析错误
自訂錯誤處理程序
有的時候,php 中自備的錯誤處理程序,並不能完全滿足我們得需要,大部分時候,我們都需要手動重寫異常處理。
php 給我們了三個函數來幫助我們來處理,分別是
set_error_handler()
- 函數來託管錯誤處理程序,可自行自訂錯誤的處理流程。
- 如果此函數之前的程式碼發生錯誤,那麼不會呼叫我們自訂的處理函數,因為尚未註冊
- 設定此函數後error_reporting() 將會失效
- 以下級別的錯誤不能由用戶定義的函數來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 該函數只能捕捉我們的部分Warning 和Note 級別的錯誤
set_exception_handler()
- 用於沒有被捕獲的例外處理
register_shutdown_function()
- #作用:註冊一個會在php中止時執行的函數
- 捕獲PHP的錯誤:Fatal Error、Parse Error等,這個方法是PHP腳本執行結束前最後一個呼叫的函數,例如腳本錯誤、 die()、exit、異常、正常結束都會調用,
- 如果拿來用錯誤處理的時候,需要配合
error_get_last()
它能取得最後發生的錯誤。
举例 register_shutdown_function('shutdown');function shutdown(){ if ($error = error_get_last()) { var_dump($error); } }$name //没写 ; 号
執行結果Parse error: syntax error, unexpected ';' in /app/swoole/errorDemo.php on line 34
Emmmmm 這不扯淡嗎?分明分明沒有執行呢?
其實原因使因為,程式執行前,我們 php 會先檢查我們程式的語法問題,如果沒有問題,我們才能執行我們的程式。
我們上面的程式碼沒用通過我們的語法檢查,所以直接報錯。
那麼問題來了?我們在框架中的時候,為什麼是框架都是框架給我們報錯?
框架的錯誤處理
在框架中,其程式碼是透過一個入口檔案來載入的。而我們php偵測語法錯誤的時候,只檢查我們的 index.php 有它 require 是不會被偵測的。當我們程式碼出錯時,那是在 run-time 中偵測的錯誤,所以我們框架中的可以對應錯誤
以上是詳解php7中異常與錯誤的處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)