ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

webman 异常处理

2023-12-10 19:48:21  阅读:59  来源: 互联网

标签:


配置

config/exception.php

return [
    // 这里配置异常处理类
    '' => support\exception\Handler::class,
];

多应用模式时,你可以为每个应用单独配置异常处理类,参见多应用

默认异常处理类

webman中异常默认由 support\exception\Handler 类来处理。可修改配置文件config/exception.php来更改默认异常处理类。异常处理类必须实现Webman\Exception\ExceptionHandlerInterface 接口。

interface ExceptionHandlerInterface
{
    /**
     * 记录日志
     * @param Throwable $e
     * @return mixed
     */
    public function report(Throwable $e);

    /**
     * 渲染返回
     * @param Request $request
     * @param Throwable $e
     * @return Response
     */
    public function render(Request $request, Throwable $e) : Response;
}

渲染响应

异常处理类中的render方法是用来渲染响应的。

如果配置文件config/app.phpdebug值为true(以下简称app.debug=true),将返回详细的异常信息,否则将返回简略的异常信息。

如果请求期待是json返回,则返回的异常信息将以json格式返回,类似

{
    "code": "500",
    "msg": "异常信息"
}

如果app.debug=true,json数据里会额外增加一个trace字段返回详细的调用栈。

你可以编写自己的异常处理类来更改默认异常处理逻辑。

业务异常 BusinessException

有时候我们想在某个嵌套函数里终止请求并返回一个错误信息给客户端,这时可以通过抛出BusinessException来做到这点。
例如:

<?php
namespace app\controller;

use support\Request;
use support\exception\BusinessException;

class FooController
{
    public function index(Request $request)
    {
        $this->chackInpout($request->post());
        return response('hello index');
    }

    protected function chackInpout($input)
    {
        if (!isset($input['token'])) {
            throw new BusinessException('参数错误', 3000);
        }
    }
}

以上示例会返回一个

{"code": 3000, "msg": "参数错误"}

注意
业务异常BusinessException不需要业务try捕获,框架会自动捕获并根据请求类型返回合适的输出。

自定义业务异常

如果以上响应不符合你的需求,例如想把msg要改为message,可以自定义一个MyBusinessException

新建 app/exception/MyBusinessException.php 内容如下

<?php

namespace app\exception;

use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;

class MyBusinessException extends BusinessException
{
    public function render(Request $request): ?Response
    {
        // json请求返回json数据
        if ($request->expectsJson()) {
            return json(['code' => $this->getCode() ?: 500, 'message' => $this->getMessage()]);
        }
        // 非json请求则返回一个页面
        return new Response(200, [], $this->getMessage());
    }
}

这样当业务调用

use app\exception\MyBusinessException;

throw new MyBusinessException('参数错误', 3000);

json请求将收到一个类似如下的json返回

{"code": 3000, "message": "参数错误"}

提示
因为BusinessException异常属于业务异常(例如用户输入参数错误),它是可预知的,所以框架并不会认为它是致命错误,并不会记录日志。

总结

在任何想中断当前请求并返回信息给客户端的时候可以考虑使用BusinessException异常。

标签:
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有