首頁 後端開發 PHP7 實例講解PHP如何在Yii框架中進行錯誤與異常處理

實例講解PHP如何在Yii框架中進行錯誤與異常處理

Jul 16, 2021 am 09:11 AM
php

Yii已經預設已經在CApplication上實現了異常和錯誤的接管,這是透過php的set_exception_handler,set_error_handler實現的。透過這兩個PHP內建函數,可以對程式中未捕獲的異常以及錯誤進行接管處理,從而提高程式的可維護性。

實例講解PHP如何在Yii框架中進行錯誤與異常處理

預設情況下,Yii會將異常處理分配給CApplication::handleException, 將錯誤處理分配給CApplication::handleError,但是可以透過在入口檔案中定義YII_ENABLE_EXCEPTION_HANDLER , YII_ENABLE_ERROR_HANDLER兩個常數為false禁止使用Yii的異常和錯誤接管機制。

以下內容中,將異常和錯誤統稱為錯誤,如有必要會進行詳細區分說明。 YII_DEBUG常數(預設為false, 可以在入口檔案中設定)對錯誤訊息的顯示有很重要的影響,debug模式下,錯誤的輸出是最詳細的。而程式一旦投入運行,則應將YII_DEBUG修改為false。

無論是否處於debug模式,Yii程式產生錯誤時都會將相關錯誤訊息進行記錄(錯誤等級為error, 分類預設為application)。不同之處是debug模式時會直接在web頁顯示詳細資訊。

CApplication:: handleError($code,$message,$file,$line)

上面的方法實現了相關邏。特別注意restore_error_handler,restore_exception_handler兩個函數,如果沒有這兩個函數的調用,那麼在後續的錯誤處理過程中,當再次產生異常或是錯誤時,又會調用CApplication:: handleError ,從而可能造成死循環,故Yii在此處暫時禁止了使用CApplication:: handleError 接管後續的錯誤和異常(使用php預設的錯誤處理機制),這就保證了不會因之產生循環呼叫。

PHP錯誤的處理當產生錯誤時,PHP會在日誌中記錄哪些資訊?錯誤代碼(即PHP的E_ERROR E_WARNING  E_STRICT E_DEPRECATED)消息內容(如Undefined vaiable $input)產生錯誤的文件路徑產生錯誤的行號額外的跟踪回溯信息(這是通過debug_backtrace實現的)當前URL

除了記錄對應日誌之外,Yii還會對錯誤進行後續處理(如中斷運行、顯示錯誤頁等),預設錯誤的處理會交給CErrorHandler元件處理(但可以透過給CApplicaton綁定onError事件處理器而實現錯誤處理的二次接管,此處的設計很靈活!)。

此時將產生一個CErrorEvent(並包含$code,$message,$file,$line幾項關鍵參數),傳遞給CErrorHandler元件進行處理。具體交給CErrorHandler::handleError處理之。這個流程主要是將錯誤相關資訊進行整理,並以適當的方式進行顯示。

是否為debug模式(YII_DEBUG==true),對錯誤訊息的顯示結果有極大影響。調試模式下我們希望能顯示詳細的錯誤追蹤訊息,而在生產模式下,我們希望給用戶顯示友好的頁面。所以,這裡的錯誤顯示有所不同,以下區分說明之。

當處於偵錯模式時,將直接渲染exception視圖展示錯誤。將按以下路徑搜尋:

protected/views/system/exception.php

#YII_PATH/views/exception.php

顯然,預設並沒有在應用程式中定義views/system目錄,故會使用系統框架自帶的視圖檔案。最終包含的檔案將是Yii框架中的views/exception.php。

從以上分析可以得知,在調試模式下如果我們要使用自訂異常頁面(一般這麼做的意義可能不大),則需要設定檔protected/views/system/exception.php , 可使用的變數即$data。

當處於非調試模式下時,會作如下處理:

設定檔中若為errorHandler元件定義了errorAction路由信息,則直接運行之,否則執行第2步流程。

嘗試載入error視圖,按以下路徑搜尋(第一個搜尋到的檔案將被使用)

protected/views/system/zh_cn/error500.php

# protected/views/system/error500.php

protected/views/system/zh_cn/error.php

protected/views/system/error.php

#YII_PATH/views /zh_cn/error500.php

YII_PATH/views/error500.php

YII_PATH/views/zh_cn/error.php

Y II_PATH/views/error.php

#異常的處理根據前面的分析,異常的處理機制與錯誤處理機制類似,也會記錄日誌,等級是error, 分類為"exception.$EXCEPTIONCLASS", 若是CHttpException類別異常,分類名稱則為exception .CHttpException.$STATUS_CODE。如資料的異常分類稱為exception.CDbException。

接下來將錯誤事件CExceptionEvent交由errorHandler處理,所有錯誤訊息都由CExceptionEvent物件傳遞而來。處理方法如下:

如果是調試模式,則按以下順序搜尋視圖文件,第一個搜尋到的文件將被使用

protected/views/system/exception.php

YII_PATH/views/exception.php

如果是非調試模式,並在設定檔中為errorHandler元件定義了errorAction屬性路由,則運行之,否則進入第3步。

以以下順序嘗試載入視圖文件,第一個搜尋到的檔案將被使用

protected/views/system/zh_cn/error500.phpprotected/views/system/error500.phpprotected/views/system/zh_cn/error.phpprotected/views/system/error.phpYII_PATH/views/zh_cn/error500.phpYII_PATH/views/error500.phpYII_PATH/views/zh_cn/error.phpY II_PATH/views/error.php
登入後複製

使用流程圖描述,會更清楚一些:搜尋檢視檔流程比較重要,因為它關係到我們如何自訂錯誤頁面的細節問題,後續的流程圖詳細描述其流程。

實例講解PHP如何在Yii框架中進行錯誤與異常處理

從圖中可以看出,最容易的方式還是給errorHandler元件設定errorAction屬性指定錯誤發生的路由

實例講解PHP如何在Yii框架中進行錯誤與異常處理

一般而言,我們最關心的是生產模式下錯誤頁面的顯示問題,經過以上分析,有兩種方法可用:

設定檔中為errorHandler元件定義errorAction路由屬性(應該優先使用這個方式,以達到彈性設定目的)

定義下列檔案中的任一個,實作自訂錯誤頁(不建議)

Protected/views/system/zh_cn/error500.php

protected/views/system/error500.php

protected/views/system/zh_cn/error.php

protected/views/system/error.php

第1種方式靈活可控,可在控制器中指定視圖文件,靈活可控。

使用錯誤處理器範例

yii\web\ErrorHandler 註冊成一個名稱為errorHandler應用程式元件, 可以在應用程式設定中配置它類似如下:

return [
'components' => [
'errorHandler' => [
'maxSourceLines' => 20,
],
],
];
登入後複製

使用如上代碼,異常頁面最多顯示20個原始碼。

如前所述,錯誤處理器將所有非致命PHP錯誤轉換成可獲取異常,也就是說可以使用以下程式碼處理PHP錯誤:

use Yii;
use yii\base\ErrorException;
try {
10/0;
} catch (ErrorException $e) {
Yii::warning("pision by zero.");
}
// execution continues...
登入後複製

如果你想顯示一個錯誤頁面告訴使用者請求是無效的或無法處理的,可簡單地拋出一個yii\web\HttpException異常, 如yii\web\NotFoundHttpException。錯誤處理器會正確地設定回應的HTTP狀態碼並使用適當的錯誤視圖頁面來顯示錯誤訊息。

use yii\web\NotFoundHttpException;
throw new NotFoundHttpException();
登入後複製

自訂錯誤顯示

yii\web\ErrorHandler錯誤處理器根據常數YII_DEBUG的值來調整錯誤顯示, 當YII_DEBUG 為true (表示在偵錯模式),錯誤處理器會顯示異常以及詳細的函數呼叫堆疊和原始碼行數來幫助調試, 當YII_DEBUG 為false,只有錯誤訊息會被顯示以防止應用的敏感資訊洩漏。

補充: 如果異常是繼承yii\base\UserException,不管YII_DEBUG為何值,函數呼叫堆疊資訊都不會顯示, 這是因為這種錯誤會被認為是使用者產生的錯誤,開發人員不需要去修正。

yii\web\ErrorHandler 錯誤處理器預設使用兩個視圖顯示錯誤:

#@yii/views/errorHandler/error.php: 顯示不包含函數呼叫堆疊資訊的錯誤訊息是使用, 當YII_DEBUG 為false時,所有錯誤都會使用該視圖。

@yii/views/errorHandler/exception.php: 顯示包含函數呼叫堆疊資訊的錯誤訊息時使用。

可以設定錯誤處理器的 yii\web\ErrorHandler::errorView 和 yii\web\ErrorHandler::exceptionView 屬性 使用自訂的錯誤顯示視圖。

使用錯誤操作

使用指定的錯誤操作來自訂錯誤顯示更方便, 為此,首先配置errorHandler元件的yii\web\ErrorHandler::errorAction 屬性,類似如下:

return [
'components' => [
'errorHandler' => [
'errorAction' => 'site/error',
],
]
];
登入後複製

yii\web\ErrorHandler::errorAction 屬性使用路由到一個操作, 上述配置表示不用顯示函數呼叫堆疊資訊的錯誤會透過執行site/error操作來顯示。

可以建立site/error 操作如下所示:

namespace app\controllers;
use Yii;
use yii\web\Controller;
class SiteController extends Controller
{
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
}
登入後複製

上述程式碼定義error 操作使用yii\web\ErrorAction 類,該類別渲染名為error視圖來顯示錯誤。

除了使用yii\web\ErrorAction, 可定義error 操作使用類似如下的操作方法:

public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
if ($exception !== null) {
return $this->render('error', ['exception' => $exception]);
}
}
登入後複製

現在應建立一個視圖檔案為views/site/error.php,在該視圖文件中,如果錯誤操作定義為yii\web\ErrorAction, 可以存取該操作中定義的以下變數:

name: 錯誤名稱

message: 錯誤訊息

# exception: 更多詳細資料的異常對象,如HTTP 狀態碼,錯誤碼,錯誤呼叫堆疊等。

補充: 如果你使用 基礎應用範本 或 進階應用範本, 錯誤操作和錯誤檢視已經定義好了。

自訂錯誤格式

錯誤處理器根據回應設定的格式來顯示錯誤, 如果yii\web\Response::format 回應格式為html, 會使用錯誤或例外視圖來顯示錯誤訊息,如上一小節所述。對於其他的回應格式,錯誤處理器會錯誤訊息作為數組賦值給yii\web\Response::data屬性,然後轉換到對應的格式, 例如,如果回應格式為json,可以看到以下回應資訊:

HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
登入後複製

可在應用程式設定中回應response元件的beforeSend事件來自訂錯誤回應格式。

return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];
登入後複製

上述代码会重新格式化错误响应,类似如下:

HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
登入後複製

推荐学习:php视频教程

以上是實例講解PHP如何在Yii框架中進行錯誤與異常處理的詳細內容。更多資訊請關注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)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在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程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

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

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

什麼是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,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles