目錄php
當程序中出現不可預期的錯誤,好比說除0異常,yii會給咱們扔出這個異常信息,因爲如今都是讀寫分離,客戶端調你的api,都是協商好的數據格式,若是業務方沒有兼容你的異常返回,客戶端出現異常錯誤,影響也挺噁心。web
再者,寫些腳本的時候,出現不可預期的異常沒有記到日誌中,對於咱們排查錯誤也是大大的麻煩。好在,yii提供錯誤處理,看看官方文檔:錯誤處理api
默認的錯誤處理是 (web)https://www.yiichina.com/doc/api/2.0/yii-web-errorhandler (console)https://www.yiichina.com/doc/api/2.0/yii-console-errorhandler,
經過重寫renderException方法,就能夠達到自定義的錯誤輸出。app
web.php 配置:yii
... 'errorHandler' => [ 'class' => 'app\controllers\ErrorController', 'errorAction' => 'site/error', ], ...
ErrorController.phpide
<?php namespace app\controllers; use app\modules\Common; use Yii; class ErrorController extends \yii\web\ErrorHandler{ protected function renderException($exception){ //todo 業務處理異常 //if( Yii::$app->request->getIsPost() && !Yii::$app->request->get('fullerror')){ // return Common::echoJson(500, $exception->getMessage()); //} parent::renderException($exception); } }
console.phpui
... 'errorHandler' => [ 'class' => 'app\commands\ErrorController' ],
ErrorController.phpspa
<?php namespace app\commands; use Yii; use yii\helpers\FileHelper; use yii\log\FileTarget; use yii\log\Logger; class ErrorController extends \yii\base\ErrorHandler{ protected function renderException($exception){ //業務處理異常 $errMsg = "文件位置:{$exception->getFile()} 所在行:{$exception->getLine()}\n". "錯誤:".$exception->getMessage(); self::writeLog('sys_exception.log',date('Y-m-d H:i:s') . "{$errMsg}\n"); } public static function writeLog($fileName, $message,$categories='') { $logPath = Yii::$app->getRuntimePath() . '/logs/' . date("Ymd") . "/"; FileHelper::createDirectory($logPath); $file = new FileTarget(); $file->logFile = $logPath . $fileName; $file->messages[] = [$message, Logger::LEVEL_INFO, $categories, time()]; $file->export(); } }