ThinkPHP6.0异常处理

2020-04-04  本文已影响0人  皮蛋馅儿

在实际开发过程中,我们可能遇到很多不可预知的异常,比如未定义的变量等,api接口定义了统一的数据结构返回,如果直接抛出异常,前端可能识别不了导致系统崩溃,所以我们要针对异常进行处理,保证代码健壮性。

1、在\app\ExceptionHandle.php的render方法可以直接处理返回异常格式

public function render($request, Throwable $e): Response
{
    // 添加自定义异常处理机制
    $result = [
        'code' => 0,
        'message' => $e->getMessage(),
        'data' => []
    ];
    return json($result, 400);
}

2、以上方法是针对公共异常处理,如果只是想对多应用模块下的api模块进行这种格式的异常返回,可以通过以下方法:
在api模块下新建exception文件夹,并且在exception下面创建Http.php文件,代码如下:

<?php

namespace app\api\exception;

use think\exception\Handle;
use think\Response;
use Throwable;

/**
 * 不可预知的异常处理
 * Class Http
 * @package app\api\exception
 */
class Http extends Handle
{
    public $httpStatus = 500;

    public function render($request, Throwable $e): Response
    {
        // http状态码获取,比如throw new \think\exception\HttpException(400, '无效请求')设置了状态码
        if (method_exists($e, 'getStatusCode')) {
            $httpStatus = $e->getStatusCode();
        } else {
            $httpStatus = $this->httpStatus;
        }

        // 添加自定义异常处理机制
        $result = [
            'code' => 0,
            'message' => $e->getMessage(),
            'data' => []
        ];
        return json($result, $httpStatus);
    }
}

在\app\api下新建provider.php,并添加如下代码

<?php

use app\api\exception\Http;

// 容器Provider定义文件
return [
    'think\exception\Handle' => Http::class,
];

测试未定义变量异常:
在\app\api\controller\Index.php,添加代码

<?php

namespace app\api\controller;

use app\BaseController;

class Index extends BaseController
{
    public function index()
    {
        echo $a;
    }
}

返回:

{"code":0,"message":"Undefined variable: a","data":[]}

测试抛出异常:

<?php

namespace app\api\controller;

use app\BaseController;

class Index extends BaseController
{
    public function index()
    {
        throw new \think\exception\HttpException(400, '无效请求');
    }
}

返回:

{"code":0,"message":"无效请求","data":[]}

并且F12调试模式下,可以看到相应的HTTP状态码也发生变化

加我微信公众号:\color{red}{皮蛋馅儿},一起学习哦~

上一篇下一篇

猜你喜欢

热点阅读