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

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中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
如何從PHP 5.6升級到PHP 7?如何從PHP 5.6升級到PHP 7?Mar 10, 2025 pm 06:29 PM

本文詳細介紹了將PHP 5.6升級為PHP 7的升級,並強調了關鍵步驟,例如備份,檢查服務器兼容性以及選擇升級方法(軟件包管理器,編譯,控制面板或Web服務器配置)。 它解決了Potentia

如何使用New Relic等工具監視PHP 7的性能?如何使用New Relic等工具監視PHP 7的性能?Mar 10, 2025 pm 06:28 PM

本文解釋瞭如何使用新遺物監視PHP 7應用程序性能。 它詳細詳細介紹了新的Relic的設置,關鍵績效指標(KPI),例如APDEX分數和響應時間,通過交易軌蹟的瓶頸標識和錯誤軌跡

如何將PHP 7應用程序部署到Web服務器?如何將PHP 7應用程序部署到Web服務器?Mar 10, 2025 pm 06:28 PM

本文詳細介紹了部署PHP 7應用程序,涵蓋方法(FTP,SSH,部署工具),服務器配置(Apache/nginx,php-fpm),數據庫設置和重要的安全考慮因素。 它突出了服務器compatib等常見挑戰

如何在PHP 7項目中使用GIT進行版本控制?如何在PHP 7項目中使用GIT進行版本控制?Mar 10, 2025 pm 06:27 PM

本文指導PHP 7開發人員使用GIT進行版本控制。 它涵蓋了初始化,分期,投入,忽略文件,遠程存儲庫,分支,合併,解決衝突和基本的GIT命令。 效率的最佳實踐

如何使用PHP 7使用Docker?如何使用PHP 7使用Docker?Mar 10, 2025 pm 06:26 PM

本文解釋了使用具有PHP 7的Docker,涵蓋了Dockerfile的創建,圖像構建和容器運行時。 它詳細介紹了安全性最佳實踐(非根本用戶,依賴關係更新,輸入驗證),使用Docker Comp的多服務管理

如何使用Xdebug進行調試PHP 7代碼?如何使用Xdebug進行調試PHP 7代碼?Mar 10, 2025 pm 06:26 PM

本文說明瞭如何使用Xdebug進行調試PHP 7代碼。 它涵蓋Xdebug配置(安裝,php.ini設置,IDE設置),斷點用法(條件,功能,遠程)和故障排除連接問題。 有效的Debuggi

如何使用PHPUNIT測試PHP 7代碼?如何使用PHPUNIT測試PHP 7代碼?Mar 10, 2025 pm 06:25 PM

本文指導PHP開發人員使用PHPUNIT測試PHP 7代碼。 它突出了從先前的PHP版本的無縫過渡,強調利用PHP 7的功能(類型提示,返回類型)以改善測試魯棒性。 文章

如何使用PHP 7使用CodeIgniter框架?如何使用PHP 7使用CodeIgniter框架?Mar 10, 2025 pm 06:24 PM

本文指導使用PHP 7的Codeigniter指導該框架的兼容性,PHP 7的發動機增強功能以​​及至關重要的安全性最佳實踐。 它涵蓋了設置,配置和利用PHP 7 Featu

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用