Yii中的錯誤及異常處理

2021-09-01 10:28:42 字數 3092 閱讀 9596

yii中的錯誤及異常處理

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

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

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

handleerror($code,$message,$file,$line)

中實現了相關邏。特別注意restore_error_handler,

handleerror

handleerror

接管後續的錯誤和異常(使用php預設的錯誤處理機制),這就保證了不會因之產生迴圈呼叫。

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

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的丟擲異常函式 另...