Yii中的錯誤及異常處理

2022-03-24 09:22:13 字數 2900 閱讀 2413

yii中的錯誤及異常處理

以下內容中,將異常和錯誤統稱為錯誤,如有必要會進行詳細區分說明。

yii_debug常量(預設為false, 可以在入口檔案中設定)對錯誤資訊的顯示有很重要的影響,debug模式下,錯誤的輸出是最詳細的。而程式一旦投入執行,則應將yii_debug修改為false。

無論是否處於debug模式,yii程式產生錯誤時均會將相關錯誤資訊進行記錄(錯誤級別為error, 分類為php)。不同之處是debug模式時會直接在web頁上顯示詳細資訊。

php錯誤的處理

當產生錯誤時,php會在日誌中記錄哪些資訊?

錯誤**(即php的e_error e_warning  e_strict e_deprecated)

訊息內容(如 undefined vaiable $input)

產生錯誤的檔案路徑

產生錯誤的行號

額外的跟蹤回溯資訊(這是通過debug_backtrace實現的)

當前url

此時將產生乙個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。

當處於非除錯模式下時,會作如下處理:

1.  配置檔案中若為errorhandler元件定義了erroraction路由資訊,則直接執行之,否則執行第2步流程。

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物件傳遞而來。處理方法如下:

1.  如果是除錯模式,則按以下順序搜尋視**件,第乙個搜尋到的檔案將被使用

protected/views/system/exception.php

yii_path/views/exception.php

2.  如果是非除錯模式,並在配置檔案中為errorhandler元件定義了erroraction屬性路由,則執行之,否則進入第3步。

3.  按以下順序嘗試載入視**件,第乙個搜尋到的檔案將被使用

3.  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

使用流程圖描述,會更清楚一些:

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

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

1. 配置檔案中為errorhandler元件定義erroraction路由屬性(應該優先使用這個方式,以達到靈活配置目的)

2. 定義以下檔案中的任意乙個,實現自定義錯誤頁(不推薦) 

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種方式靈活可控,可以在控制器中指定視**件,靈活可控。

大小: 62.8 kb

鏈結

Yii中的錯誤及異常處理

yii中的錯誤及異常處理 以下內容中,將異常和錯誤統稱為錯誤,如有必要會進行詳細區分說明。yii debug常量 預設為false,可以在入口檔案中設定 對錯誤資訊的顯示有很重要的影響,debug模式下,錯誤的輸出是最詳細的。而程式一旦投入執行,則應將yii debug修改為false。無論是否處於...

Yii中的錯誤及異常處理

yii中的錯誤及異常處理 以下內容中,將異常和錯誤統稱為錯誤,如有必要會進行詳細區分說明。yii debug常量 預設為false,可以在入口檔案中設定 對錯誤資訊的顯示有很重要的影響,debug模式下,錯誤的輸出是最詳細的。而程式一旦投入執行,則應將yii debug修改為false。無論是否處於...

PHP 錯誤處理及異常處理

1.設定自己的錯誤處理函式 trigger error 捕捉使用者級別的錯誤。set error handler 使用者自定義錯誤處理函式。2.捕獲異常 捕獲異常當然用trycatch 當然 中使用的異常處理類是thinkphp中,throw exception 為thinkphp的丟擲異常函式 另...