異常是指程式執行中不符合預期情況以及與正常流程不同的狀況。
比如你鏈結資料庫,在引數都寫上去的條件下,發現鏈結不上去,這就屬於不符合預期
可以被 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錯誤處理)
世界上沒有絕對完美的事,對於程式設計師來說更是如此,無論我們多麼努力 多麼細心的開發乙個專案,總會有缺陷和錯誤的存在。錯誤和異常的異同 錯誤 和 異常 的概念十分相似,很容易混淆,錯誤 和 異常 都表明了專案出了問題,都會提供相關的資訊,並且都有錯誤型別。然而,異常機制 是在 錯誤機制 後才出現的,...