PHP7錯誤和異常處理實例分享
錯誤和異常的異同
"錯誤"和"異常"的概念十分相似,很容易混淆,"錯誤"和"異常"都表明了項目出了問題,都會提供相關的信息,並且都有錯誤類型。然而,"異常機制"是在"錯誤機制"後才出現的,"異常"是避免"錯誤"的不足。比較重要的一點就是因為"錯誤"的資訊不豐富,我們見過最多的函數說明就是: 成功時候返回***, 錯誤的時候返回FALSE, 然而一個函數出錯的原因可能有多種, 出錯的種類更有多種. 一個簡單的FALSE, 並不能把具體的錯誤訊息告訴呼叫者.
PHP中將程式碼自身異常(一般是環境或語法非法所致)成為錯誤,將運行中出現的邏輯錯誤稱為異常(Exception)錯誤是沒法通過程式碼處理的,而異常則可以透過try/catch處理.
異常
異常是Exception類別的對象,在遇到無法修復的狀況時拋出,出現問題時,異常用於主動出擊,委託職責,異常還可用於防守,預測潛在的問題,減輕其影響。
Exception物件有兩個主要的屬性:一個是訊息,另一個是數字程式碼。我們分別可以用getCode()和getMessage()來取得這兩個屬性。如下:
<?php $exception = new Exception("figthing!!!",100); $code = $exception->getCode();//100 $message = $exception->getMessage();//fight.....
拋出例外
當一個例外被拋出後程式碼會立即停止執行,其後的程式碼將不會繼續執行,PHP 會嘗試尋找符合的"catch"代碼塊。如果一個異常沒有被捕獲,而且又沒用使用set_exception_handler()作相應的處理的話,那麼 PHP 將會產生一個嚴重的錯誤,並且輸出未能捕獲異常(Uncaught Exception ...)的提示信息。
throw new Exception("this is a exception");//使用throw抛出异常
捕獲異常
我們應該捕獲拋出的異常並且使用優雅的方式處理。攔截並處理異常的方式是,把可能拋出異常的程式碼放到try/catch區塊中。並且如果使用多個catch攔截多個異常的時候,只會運行其中一個,如果PHP沒有找到合適的catch塊,異常會向上冒泡,直到PHP腳本由於致命錯誤而終止運行。如下:
try { throw new Exception("Error Processing Request"); $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name"); } catch (PDOException $e) { echo "pdo error!"; } catch(Exception $e){ echo "exception!"; }finally{ echo "end!";//finally是在捕获到任何类型的异常后都会运行的一段代码 }
运行结果:exception!end!
異常處理程序
那麼我們應該如何捕捉每個可能拋出的例外呢? PHP允許我們註冊一個全域異常處理程序,捕獲所有未被捕獲的異常。異常處理程序使用set_exception_handler()函式註冊(這裡使用匿名函式)。
set_exception_handler(function (Exception $e) { echo "我自己定义的异常处理".$e->getMessage(); }); throw new Exception("this is a exception"); //运行结果:我自己定义的异常处理this is a exception
錯誤
除了異常之外,PHP還提供了用於報告錯誤的函數。 PHP能觸發不同類型的錯誤,例如致命錯誤、執行階段錯誤、編譯時錯誤、啟動錯誤、使用者觸發的錯誤。可以在php.ini中設定錯誤報告方式(這裡不做多的解釋)
下面列舉一些錯誤報告層級:
值 常量 说明1 E_ERROR 报告导致脚本终止运行的致命错误2 E_WARNING 报告运行时的警告类错误(脚本不会终止运行)4 E_PARSE 报告编译时的语法解析错误8 E_NOTICE 报告通知类错误,脚本可能会产生错误32767 E_ALL 报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)
無論如何都必須遵守以下幾條規則:
一定要讓PHP報告錯誤
在開發環境中要顯示錯誤
在生產環境中不能顯示錯誤
在開發環境與生產環境中都要記錄錯誤
錯誤處理程序
與異常處理程序一樣,我們也可以使用set_error_handler()註冊全域錯誤處理程序,使用自己的邏輯方式攔截並處理PHP錯誤。我們要在錯誤處理程序中呼叫die()或exit()函數。如果不調用,PHP腳本會從出錯的地方繼續向下執行。如下:
set_error_handler(function ($errno,$errstr,$errfile,$errline)//常用的四个参数 { echo "错误等级:".$errno."<br>错误信息:".$errstr."<br>错误的文件名:".$errfile."<br>错误的行号:".$errline; exit(); }); trigger_error("this is a error");//自行触发的错误 echo '正常';
運行結果:
錯誤等級:1024
錯誤訊息:this is a error
錯誤的檔案名稱:/Users/toby/Desktop/www/Exception.php
錯誤的行號:33
相關的還有一個函數register_shutdown_function()---是一個會在php中止時執行的函數。 (有興趣的可以自行查詢一下)
錯誤轉換為異常
我們可以把PHP錯誤轉換為異常(並不是所有的錯誤都可以轉換,只能轉換php.ini文件中error_reporting指令設定的錯誤),使用處理異常的現有流程處理錯誤。這裡我們使用set_error_handler()函數將錯誤訊息託管至ErrorException(它是Exception的子類別),進而交給現有的例外系統處理。如下:
set_exception_handler(function (Exception $e) { echo "我自己定义的异常处理".$e->getMessage(); }); set_error_handler(function ($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline);//转换为异常 }); trigger_error("this is a error");//自行触发错误
運行結果:我自己定義的例外處理this is a error
PHP7的錯誤異常處理
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。
这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
$a=1; try { $a->abc();//未定义此对象 } catch (Exception $e) { echo "error"; } catch (Error $e) { echo $e->getCode(); }
运行结果:0
PHP7 中出现了 Throwable 接口,该接口由 Error 和 Exception 实现,用户不能直接实现 Throwable 接口,而只能通过继承 Exception 来实现接口
try { // Code that may throw an Exception or Error. } catch (Throwable $t) { // Executed only in PHP 7, will not match in PHP 5.x } catch (Exception $e) { // Executed only in PHP 5.x, will not be reached in PHP 7 }
注意实际项目中,在开发环境中我们可以使用Whoops组件,在生产环境中我们可以使用Monolog组件。
相关推荐:
以上是PHP7錯誤和異常處理實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

在Docker環境中使用PECL安裝擴展時報錯的原因及解決方法在使用Docker環境時,我們常常會遇到一些令人頭疼的問�...

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

在同一系統中同時運行多個PHP版本是一個常見的需求,特別是當不同項目依賴於不同版本的PHP時。如何在同一台...

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。
