首頁 後端開發 php教程 PHP7錯誤和異常處理實例分享

PHP7錯誤和異常處理實例分享

Mar 13, 2018 am 09:52 AM
php 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 &#39;正常&#39;;
登入後複製

運行結果:
錯誤等級: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组件。

相关推荐:

PHP错误处理方法实例

php错误处理和日志记录

PHP异常处理和错误处理方法分享

以上是PHP7錯誤和異常處理實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

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

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

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

在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? 在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? Apr 01, 2025 pm 03:06 PM

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

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

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

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

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

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

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

如何在同一台服務器上通過Nginx配置讓PHP5.6和PHP7共存? 如何在同一台服務器上通過Nginx配置讓PHP5.6和PHP7共存? Apr 01, 2025 pm 03:15 PM

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

說明匹配表達式(PHP 8)及其與開關的不同。 說明匹配表達式(PHP 8)及其與開關的不同。 Apr 06, 2025 am 12:03 AM

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

See all articles