• Yii错误异常处理


    背景

    当程序中出现不可预期的错误,比如说除0异常,yii会给我们扔出这个异常信息,由于现在都是读写分离,客户端调你的api,都是协商好的数据格式,如果业务方没有兼容你的异常返回,客户端出现异常错误,影响也挺恶心。

    再者,写些脚本的时候,出现不可预期的异常没有记到日志中,对于我们排查错误也是大大的麻烦。好在,yii提供错误处理,看看官方文档:错误处理

    默认的错误处理是 (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方法,就可以达到自定义的错误输出。

    web错误处理

    web.php 配置:

    ...
     'errorHandler' => [
                'class' => 'appcontrollersErrorController',
                'errorAction' => 'site/error',
            ],
    ...
    

    ErrorController.php

    <?php
    
    namespace appcontrollers;
    
    use appmodulesCommon;
    use Yii;
    
    
    class ErrorController extends yiiwebErrorHandler{
    
        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错误处理

    console.php

    ...
       'errorHandler' => [
                'class' => 'appcommandsErrorController'
            ],
    

    ErrorController.php

    <?php
    namespace appcommands;
    
    use Yii;
    use yiihelpersFileHelper;
    use yiilogFileTarget;
    use yiilogLogger;
    
    
    class ErrorController extends yiiaseErrorHandler{
    
        protected function renderException($exception){
    
            //业务处理异常
            $errMsg = "文件位置:{$exception->getFile()} 所在行:{$exception->getLine()}
    ". "错误:".$exception->getMessage();
            self::writeLog('sys_exception.log',date('Y-m-d H:i:s') . "{$errMsg}
    ");
        }
    
    
        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();
        }
    }
    
    
  • 相关阅读:
    501. 二叉搜索树中的众数
    530. 二叉搜索树的最小绝对差
    Java强制类型转换注意
    PL_SQL常用快捷键及设置
    Java线程:大总结
    Java多线程售票程序分析
    Java多线程的几种实现方式
    Java线程的几种状态
    Java的同步机制:synchronized关键字
    Eclipse常用设置[不断完善]
  • 原文地址:https://www.cnblogs.com/followyou/p/10851944.html
Copyright © 2020-2023  润新知