网站

thinkphp5 实现自定义全局异常处理 try和catch返回信息自定义

分类 :thinkphp5     2019-05-27 人气:0 0条评论

 包含的文件

我们在application下新建lib,并在里面创建exception文件夹
该文件夹用于错误异常处理的文件存放
在里面创建文件
  • ExceptionHandler.php 异常信息处理文件
  • BaseException.php 错误代码总返回文件
  • BannerMissException.php Banner文件的错误信息代码返回库

config.php中配置

在里面找到
'exception_handle'       => '',
将上面ExceptionHandler.php引入进去,变成
'exception_handle'       => 'app\lib\exception\ExceptionHandler',
只有我们引入自己的异常信息提示,异常处理时才会显示我们自定义的,否则会默认使用tp系统的

其它的文件

application\api\controller\v1下的
Banner.php 控制器处理文件
application\api\model
Banner.php 假设进行了banner库操作

v1中的Banner.php内容

IDMustBePostiveInt())->goCheck() 这行只是用于接收传入的参数,IDMustBePostiveInt会对参数格式做一些判断,我们这儿用不到,跳过
BannerM::getBannerById 在Banner模型中对id进行查询的处理
throw new BannerMissException 抛出我们写的异常处理
<?php
namespace app\api\controller\v1;
use think\Controller;
use think\image\Exception;
use think\Validate;
use app\api\validate\IDMustBePostiveInt;
use app\api\model\Banner as BannerM;
use app\lib\exception\BannerMissException;
class Banner extends Controller
{
    /**
     * 获取指定id的banner信息
     * @url /banner/:id
     * @http GET
     * @id banner的id号
     */
    public function getBanner($id)
    {
        (new IDMustBePostiveInt())->goCheck();

        $banner = BannerM::getBannerById($id);
        if(!$banner){
            throw new BannerMissException();
        }
        return $banner;
    }
}

moder中的Banner.php内容

只是象征性的返回一个空值,以达到抛出错误处理语句
class Banner extends Model
{
    public static function getBannerById()
    {
        return null;
    }
}

BaseException中内容

异常处理抛出错误的总文件,如果没单独指定,则使用该文件,该文件继承了Exception
<?php
namespace app\lib\exception;
use think\Exception;


/**
 * @code Http状态码,如404,200等
 * @msg 错误具体信息
 * @errorCode 自定义错误码
 */
class BaseException extends Exception
{
    public $code = 400;
    public $msg ='参数错误';
    public $errorCode = 10000;
}

BannerMissException.php

为Banner设置的异常返回文件,继承自BaseException这个
<?php
namespace app\lib\exception;


class BannerMissException extends BaseException
{
    public $code = 404;
    public $msg ='Banner不存在';
    public $errorCode = 40000;
}

ExceptionHandler.php内容

建在控制器application里面或同级都可以
继承系统原有异常处理Handel
<?php
namespace app\lib\exception;

use Exception;
use think\exception\Handle;


class ExceptionHandler extends  Handle
{
    public $code;
    public $msg;
    public $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 = 999;
        }
        $result = [
            'msg' => $this->msg,
            'error_code' => $this->errorCode,
            'request_url' => ''
        ];
        return json($result,$this->code);
    }
}

输入测试

输入http://127.0.0.1/banner/2 返回
{"msg":"Banner不存在","error_code":40000,"request_url":""}
输入http://127.0.0.1/banner/2.1 返回
{"msg":"服务器内部错误","error_code":999,"request_url":""}

调试模式开启返回程序默认信息

上面只返回我们自己的,适合运行中使用,不适合调试错误,所以我们加一个功能,判断调试模式以便于维护
ExceptionHandler.php中修改
找到
$this->code = 500;
                $this->msg = '服务器内部错误';
                $this->errorCode = 999;
将上面代码放入新增判断中
else {
            #直接使用config功能读取app_debug的配置,当调试功能打开后,我们便显示框架默认错误
            if (config('app_debug')) {
                #为true返回框架默认的错误,否则用自己的
                return parent::render($e);
            } else {
                $this->code = 500;
                $this->msg = '服务器内部错误';
                $this->errorCode = 999;
            }
        }

抛出msg变成我们自定义的

在上面,banner如果不存在,会输出为banner不存在的错误,但其它的则没有输出,只是输出了服务器错误,但我们并不知道错误在哪,所以我们将其改为输出我们自己的错误

BaseValidate.php内容

前面的goCheck便是来自这个文件,现在我们放上
其中$this->error这个在这儿返回的是IDMustBePostiveInt.php中返回的判断,用于判断输入的id是不是整数,非整数则返回id必须是正整数
new BaseException,引入我们上面定义的可以接收未定义错误的这么个页面,这儿我们也用这个即可
<?php
namespace app\api\validate;
use think\Exception;
use think\Validate;
use app\lib\exception\BaseException;
class BaseValidate extends Validate
{
    public function goCheck()
    {
        $request = input('param.');

        $result = $this->check($request);
        
        if(!$result){
            $e = new BaseException();
            $e->msg = $this->error;  #将BaseException中的msg的内容换成系统返回的错误
            throw $e;
        }else{
            return true;
        }
    }
}
  • 未使用前输入http://127.0.0.1/banner/1.5,返回的错误
{"msg":"服务器内部错误","error_code":999,"request_url":""}
  • 使用后输入http://127.0.0.1/banner/1.5,返回的错误
{"msg":"id必须是正整数","error_code":10000,"request_url":""}
这样我们便知道,到底是哪个出错了

评论

大侠名号:   验证暗号: 点击我更换图片

继续阅读