PHP7中異常與錯誤處理和自定義異常

2022-09-13 01:24:13 字數 3267 閱讀 4194

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

比如你鏈結資料庫,在引數都寫上去的條件下,發現鏈結不上去,這就屬於不符合預期

可以被 try-catch 捕捉得到

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

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

例如:除了這幾種情況,其餘全部為異常

在以前的 php5.x 中 並且不能被 try-catch 捕捉得到,到了 php 7.x 中,定義了乙個 throwable 介面 並使得大部分的 error 和

exception 實現了該介面,我們得以在 try-catch 中丟擲該錯誤

所以說以後想要捕獲異常,而你又不知道此異常是 error 還是 exception 的話,可以向這樣丟擲

trycatch(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 給我們提供了三個函式來幫助我們來處理,分別是

// 舉例:

register_shutdown_function('shutdown');

function shutdown()

}$name //沒寫 ; 號

emmmmm 這不扯淡嗎? 分明分明沒有執行呢?

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

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

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

在框架中,其**是通過乙個入口檔案來載入的。而我們php檢測語法錯誤的時候,只檢查我們的 index.php 有沒有錯誤, require 檔案中的**是不會受到檢測的。在index.php檔案中通常會定義一些錯誤異常的處理。當我們**出錯時,那是在 run-time 中檢測的錯誤,我們的框架可以根據我們編寫的錯誤異常自行做出處理。

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

// [ 應用入口檔案 ]  index.php

namespace think;

// 載入基礎檔案

require __dir__ . '/../thinkphp/base.php';

// 支援事先使用靜態方法設定request物件和config物件

// 執行應用並響應

在我們的入口檔案中,載入了base.php在這個檔案中,tp 定義了自己的異常處理

// 載入loader類

require __dir__ . '/library/think/loader.php';

// 註冊自動載入

loader::register();

// 註冊錯誤和異常處理機制

error::register();

// 實現日誌介面

if (inte***ce_exists('psr\log\loggerinte***ce'))

// 註冊類庫別名

loader::addclassalias([

//dosomething

]);/**

* 註冊異常處理

* @access public

* @return void

*/public static function register()

可以看到 tp是在入口指令碼就註冊了 異常處理機制,分別把 error 、exception、shutdown的處理都註冊進來。後序所有的異常都不會走php原本的異常而是走 tp 自定義的異常。

對php後端技術,對php架構技術感興趣的朋友,我的官方群點選此處,一起學習,相互討論。

部分資料截圖:

php7中的異常和錯誤處理

在php7.版本中,一些error和exception可以通過try catch語句捕獲到 可捕獲的異常 錯誤大致有以下三種 error php核心丟擲錯誤的專用型別,如類不存在,函式不存在,函式引數錯誤,都會丟擲此型別的錯誤,php 中不應該使用error類來作為異常丟擲 exception 應用...

的異常處理 php7異常與錯誤處理和自定義異常

7.2版本異常與錯誤的概述 什麼叫做異常?異常是指程式執行中不符合預期情況以及與正常流程不同的狀況。比如你鏈結資料庫,在引數都寫上去的條件下,發現鏈結不上去,這就屬於不符合預期。可以被 try catch 捕捉得到 什麼叫做錯誤?是屬於php程式自身的問題,一般是由非法的語法,環境問題導致的,使得編...

PHP錯誤和異常詳解(PHP7錯誤處理)

世界上沒有絕對完美的事,對於程式設計師來說更是如此,無論我們多麼努力 多麼細心的開發乙個專案,總會有缺陷和錯誤的存在。錯誤和異常的異同 錯誤 和 異常 的概念十分相似,很容易混淆,錯誤 和 異常 都表明了專案出了問題,都會提供相關的資訊,並且都有錯誤型別。然而,異常機制 是在 錯誤機制 後才出現的,...