目錄
#什麼叫做異常?
什麼叫做錯誤?
#異常處理
set_error_handler()
set_exception_handler()
register_shutdown_function()
框架的錯誤處理
首頁 後端開發 PHP7 詳解php7中異常與錯誤的處理

詳解php7中異常與錯誤的處理

Mar 30, 2021 am 10:38 AM

詳解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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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