美文网首页收藏
thinkphp5.0 全局异常捕获处理

thinkphp5.0 全局异常捕获处理

作者: 暴躁程序员 | 来源:发表于2023-01-31 18:07 被阅读0次

一、异常捕获和处理

模拟 model层出现了异常,在controller层捕获异常,并给前端返回json格式异常信息

  1. 捕获model层异常,并给前端返回json格式异常信息
    在controller层 application\api\controller\Login.php 中
<?php

namespace app\api\controller;

use app\api\model\LoginModel;
use think\Exception;

class Login
{
    public function postInfo($name,$pwd)
    {
        try {
             $login_info = LoginModel::getLoginInfo($name,$pwd);
            // throw new Exception('controller异常了哟');
        }catch (Exception $exc){
            $code = 400;
            $error = [
                'error_code'=>'10001',
                'msg'=>$exc->getMessage()
            ];
            return json($error,$code);
        }

    }

}
  1. 模拟抛出异常
    在model层 application\api\model\LoginModel.php 中
<?php

namespace app\api\model;

use think\Exception;

class LoginModel
{
    public static function getLoginInfo($name,$pwd){
        throw new Exception('model异常了哟');
    }
}

二、全局异常捕获处理

捕获所有异常,统一处理后,返回json格式

1. 定义 application\exception\BaseException.php 异常处理基类

定义默认的异常处理参数

<?php

namespace app\exception;

use think\Exception;

class BaseException extends Exception
{
    public $code = 400;
    public $msg = '错误请求';
    public $errorCode = 1000;

    /**
     * @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('errorCode',$params)){
            $this->errorCode = $params['errorCode'];
        }
    }
}

2. 定义 application\exception\ExceptionHandler.php 全局异常捕获处理,并配置生效

  1. 定义全局异常处理类
    捕获异常并返回json格式的异常信息,服务器内部错误返回500,其他异常按照自定义的异常信息返回
<?php

namespace app\exception;

use Exception;
use think\exception\Handle;

class ExceptionHandler extends Handle
{
    protected $code;
    protected $msg;
    protected $errorCode;
    public function render(Exception $e)
    {
        if ($e instanceof BaseException) {
            $this->code = $e->code;
            $this->msg = $e->msg;
            $this->errorCode = $e->errorCode;
        }else{
            $this->code = 500;
            $this->msg = '服务器内部错误';
            $this->errorCode = 1;
        }

        $result = [
            'msg' => $this->msg,
            'error_code' => $this->errorCode,
        ];

        return json($result,$this->code);
    }

}
  1. 把全局异常处理类配置到 application\config.php
    exception_handle 属性值:自定义的全局异常处理类的命名空间\全局异常处理类名称
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle'       => 'app\exception\ExceptionHandler',

3. 定义 application\exception\LoginException.php 异常处理类

为全局异常处理赋值

<?php

namespace app\exception;

class LoginException extends BaseException
{
    public $code = 404;
    public $msg = '未找到指定页面';
    public $errorCode = 1000;
}

4. 使用异常自定义的异常处理

在控制层 application\api\controller\Login.php 中,抛出异常

<?php

namespace app\api\controller;

use app\exception\LoginException;
use think\Exception;

class Login
{
    public function postInfo($name,$pwd)
    {
       
//                throw new Exception('异常'); // 触发服务器内部错误异常,状态码 500
        throw new LoginException('model 丢失'); // 触发自定义异常
    }
}

三、异常信息记录到日志

thinkphp5.0 会自动将异常信息记录到日志
日志配置文件:config.php
日志存储目录:runtime\log
日志指向配置,在 thinkphp\base.php 中 配置新路径可改变日志的存储位置

defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);

相关文章

网友评论

    本文标题:thinkphp5.0 全局异常捕获处理

    本文链接:https://www.haomeiwen.com/subject/ogomhdtx.html