溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php7中異常與錯誤的處理方法

發(fā)布時間:2021-03-30 13:44:25 來源:億速云 閱讀:135 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關php7中異常與錯誤的處理方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

異常與錯誤的概述

什么叫做異常?

異常是指程序運行中不符合預期情況以及與正常流程不同的狀況。

比如你鏈接數(shù)據庫,在參數(shù)都寫上去的條件下,發(fā)現(xiàn)鏈接不上去,這就屬于不符合預期

可以被 try-catch 捕捉得到

什么叫做錯誤?

是屬于php程序自身的問題,一般是由非法的語法,環(huán)境問題導致的,使得編譯器無法通過檢查,甚至無法運行的情況。
平時遇到的 warming、notice都是錯誤,只是級別不同而已。

例如:

  • TypeError(類型錯誤) 我規(guī)定的函數(shù)參數(shù)類型和傳入的參數(shù)不一致

  • ArithmeticError (算數(shù)錯誤)

  • ParseError (解析錯誤)在調入的文件中,include “demo.php”,或者 eval();中有語法錯誤造成解析失敗

  • AssertionError(斷言錯誤)當assert生效時產生該錯誤

  • pisionByZeroError (分母為零) 運算過程中例如除法,分母為0

除了這幾種情況,其余全部為異常

異常處理

在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定義了一個 Throwable 接口 并使得大部分的 Error 和
Exception 實現(xiàn)了該接口,我們得以在 try-catch 中拋出該錯誤

所以說以后想要捕獲異常,而你又不知道此異常是 Error 還是 Exception 的話,可以向這樣拋出

try{
    ……
}catch(Throwable $e){
    ……
}

錯誤的級別

在 php 中的錯誤也是有級別的

Parse error >Fatal Error > Waning > Notice >Deprecated

Deprecated 最低級別的錯誤(不推薦,不建議)
使用一些過期函數(shù)的時候會出現(xiàn),程序繼續(xù)執(zhí)行

Notice 通知級別的錯誤
使用一些未定義變量、常量或者數(shù)組key沒有加引號的時候會出現(xiàn),程序繼續(xù)執(zhí)行
        E_NOTICE      // 運行時通知。表示腳本遇到可能會表現(xiàn)為錯誤的情況.
        E_USER_NOTICE // 用戶產生的通知信息。Waning 警告級別的錯誤
程序出問題了,需要修改代碼?。?!程序繼續(xù)執(zhí)行
        E_WARNING         // 運行時警告 (非致命錯誤)。
        E_CORE_WARNING    // PHP初始化啟動過程中發(fā)生的警告 (非致命錯誤) 。
        E_COMPILE_WARNING // 編譯警告
        E_USER_WARNING    // 用戶產生的警告信息Fatal Error 錯誤級別的錯誤
程序直接報錯,需要修改代碼?。?!中斷程序執(zhí)行,可使用register_shutdown_function()函數(shù)在程序終止前觸發(fā)一個函數(shù)
        E_ERROR         // 致命的運行錯誤,錯誤無法恢復,暫停執(zhí)行腳本
        E_CORE_ERROR    // PHP啟動時初始化過程中的致命錯誤
        E_COMPILE_ERROR // 編譯時致命性錯,就像由Zend腳本引擎生成了一個E_ERROR
        E_USER_ERROR    // 自定義錯誤消息。像用PHP函數(shù)trigger_error(錯誤類型設置為:E_USER_ERROR)Parse error 語法解析錯誤
語法檢查階段報錯,需要修改代碼?。?!中斷程序執(zhí)行,除了修改ini文件,將錯誤信息寫到日志中,什么也做不了
        E_PARSE  //編譯時的語法解析錯誤

自定義錯誤處理程序

有的時候,php 中自帶的錯誤處理程序,并不能完全滿足我們得需要,大部分時候,我們都需要手動重寫異常處理。

php 給我們提供了三個函數(shù)來幫助我們來處理,分別是

set_error_handler()
  • 函數(shù)來托管錯誤處理程序,可自行定制錯誤的處理流程。

  • 如果此函數(shù)之前的代碼發(fā)生錯誤,那么不會調用我們自定義的處理函數(shù),因為還未注冊

  • 設置此函數(shù)后 error_reporting() 將會失效

  • 以下級別的錯誤不能由用戶定義的函數(shù)來處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 該函數(shù)只能捕捉我們的 部分 Warning 和 Note 級別的錯誤

set_exception_handler()
  • 用于沒有被捕獲的異常處理

register_shutdown_function()
  • 作用:注冊一個會在php中止時執(zhí)行的函數(shù)

  • 捕獲PHP的錯誤:Fatal Error、Parse Error等,這個方法是PHP腳本執(zhí)行結束前最后一個調用的函數(shù),比如腳本錯誤、die()、exit、異常、正常結束都會調用,

  • 如果拿來用錯誤處理的時候,需要配合error_get_last() 它能獲取最后發(fā)生的錯誤。

舉例
register_shutdown_function('shutdown');function shutdown(){
    if ($error = error_get_last()) {
        var_dump($error);
    }
}$name   //沒寫 ; 號

執(zhí)行結果
Parse error: syntax error, unexpected ';' in /app/swoole/errorDemo.php on line 34
Emmmmm 這不扯淡嗎? 分明分明沒有執(zhí)行呢?

其實原因使因為,程序執(zhí)行前,我們 php 會先檢查我們程序的語法問題,如果沒有問題,我們才能執(zhí)行我們的程序。

我們上面的代碼沒用通過我們的語法檢查,所以直接報錯。

那么問題來了? 我們在框架中的時候,為什么是框架都是框架給我們報錯呢?

框架的錯誤處理

在框架中,其代碼是通過一個入口文件來加載的。而我們php檢測語法錯誤的時候,只檢查我們的 index.php 有它 require 是不會受到檢測的。當我們代碼出錯時,那是在 run-time 中檢測的錯誤,所以我們框架中的可以相應錯誤

關于“php7中異常與錯誤的處理方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI