tp5.1使用总结(4):构建全局异常处理层

tp5.1异常处理接管

    1:需要在应用配置文件app.php中配置参数exception_handle

阿群博客

    2:建个基类异常处理

<?php
namespace app\common\exception;

use think\Exception;

class BaseException extends Exception
{
    public $code = 1000;
    public $msg = 'invalid parameters';
    public $data = '';

    /**
     * 构造函数,接收一个关联数组
     * @param array $params 关联数组只应包含code、msg和errorCode,且不应该是空值
     */
    public function __construct($params=[])
    {
       
        if (!is_array($params)) {
            return;
        }

        if (array_key_exists('code', $params)) {
            $this->code = $params['code'];
        }

        if (array_key_exists('msg', $params)) {
            $this->msg = $params['msg'];
        }

        if (array_key_exists('data', $params)) {
            $this->data = $params['data'];
        }
    }

}

    3:自定义类需要继承think\exception\Handle并且实现render方法,可以参考如下代码

<?php
namespace app\common\exception;

use think\exception\Handle;
use think\facade\Log;
use code\Code;

/**
 * Class ExceptionHandler
 * @package app\lib\exception  重写Handle的render方法,实现自定义方法
 */
class ExceptionHandler extends Handle
{
    private $code;
    private $msg;
    private $data;

    public function render(\Exception $e)
    {

        if ($e instanceof BaseException) {
            //如果是自定义异常,则控制http状态码,不需要记录日志
            //因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
            //不应当记录日志
            $this->code = $e->code;
            $this->msg  = $e->msg;
            $this->data = $e->data;
           
        } else {
            // 如果是服务器未处理的异常,将http状态码设置为500,并记录日志
            if (config('app_debug')) {
                // 调试状态下需要显示TP默认的异常页面,因为TP的默认页面 很容易看出问题
                return parent::render($e);
            }

            $this->code = Code::SYSTEM_ERROR;
            $this->msg = lang('system_error');
            $this->data = '';

            $this->recordErrorLog($e);
        }

        $result = [
            'code'          => $this->code,
            'msg'           => $this->msg,
            'data'          => $this->data,
        ];
       
        return json($result);
    }

    /**
     * 将异常写入日志
     * @param Exception $e
     */
    private function recordErrorLog(\Exception $e)
    {
        Log::init([
            'type' => 'File',
            'path' => LOG_PATH,
            'level' => ['error'],
        ]);

        Log::record($e->getMessage(), 'error');
    }
}

    4:其他异常类继承基类

<?php
namespace app\common\exception;

use code\Code;

class ParameterException extends BaseException
{
    public $code = Code::PARAMS_DEFECT;
    public $msg = 'request param error';
    public $data = '';

}


阿群博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论