日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

php try报错程序中断,php7异常与错误处理和自定义异常

發布時間:2025/4/5 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php try报错程序中断,php7异常与错误处理和自定义异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

7.2版本異常與錯誤的概述

什么叫做異常?

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

比如你鏈接數據庫,在參數都寫上去的條件下,發現鏈接不上去,這就屬于不符合預期。

可以被 try-catch 捕捉得到

什么叫做錯誤?

是屬于php程序自身的問題,一般是由非法的語法,環境問題導致的,使得編譯器無法通過檢查,甚至無法運行的情況。

平時遇到的 warming、notice都是錯誤,只是級別不同而已。

例如:TypeError(類型錯誤) 我規定的函數參數類型和傳入的參數不一致

ArithmeticError (算數錯誤)

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

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

DivisionByZeroError (分母為零) 運算過程中例如除法,分母為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_ERRORE_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 文件中的代碼是不會受到檢測的。在Index.php 文件中通常會定義一些錯誤異常的處理。當我們代碼出錯時,那是在 run-time 中檢測的錯誤,我們的框架可以根據我們編寫的錯誤異常自行做出處理。

下面我們舉個例子 在 ThinkPHP5中的異常處理

// [ 應用入口文件 ] index.phpnamespace think;// 加載基礎文件require __DIR__ . '/../thinkphp/base.php';// 支持事先使用靜態方法設置Request對象和Config對象// 執行應用并響應Container::get('app')->run()->send();

在我們的入口文件中,加載了 base.php 在這個文件中,TP 定義了自己的異常處理

// 載入Loader類require __DIR__ . '/library/think/Loader.php';// 注冊自動加載Loader::register();// 注冊錯誤和異常處理機制Error::register();// 實現日志接口if (interface_exists('Psr\Log\LoggerInterface')) {//doSomething}// 注冊類庫別名Loader::addClassAlias([//doSomething]);/*** 注冊異常處理* @access public* @return void*/public static function register(){error_reporting(E_ALL);set_error_handler([__CLASS__, 'appError']);set_exception_handler([__CLASS__, 'appException']);register_shutdown_function([__CLASS__, 'appShutdown']);}

可以看到 TP是在入口腳本就注冊了 異常處理機制,分別把 Error 、Exception、Shutdown的處理都注冊進來。后序所有的異常都不會走PHP原本的異常而是走 TP 自定義的異常。

來源:https://segmentfault.com/a/1190000020172875宜歲月崢嶸

不忘初心

不求上進

總結

以上是生活随笔為你收集整理的php try报错程序中断,php7异常与错误处理和自定义异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。