hyperf中如何实现异常处理

发布时间:2021-12-31 11:54:09 阅读:1317次
为什么要使用异常

在 Hyperf 里,业务代码都运行在 Worker 进程 上,也就意味着一旦任意一个请求的业务存在没有捕获处理的异常的话,都会导致对应的 Worker 进程 被中断退出,这对服务而言也是不能接受的,捕获异常并输出合理的报错内容给客户端也是更加友好的。
我们可以通过对各个 server 定义不同的 异常处理器(ExceptionHandler),一旦业务流程存在没有捕获的异常,都会被传递到已注册的 异常处理器(ExceptionHandler) 去处理。

如何实现

创建异常类

<?php

namespace App\Exception;

use Hyperf\Server\Exception\ServerException;


class FooException extends ServerException
{
    public $data = [];

    public function __construct($message = "操作失败", int $code = 400, $data = [])
    {
        $this->message = $message;
        $this->code = $code;
        $this->data = $data;
    }
}

定义异常处理器

<?php

namespace App\Exception\Handler;

use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Psr\Http\Message\ResponseInterface;
use App\Exception\FooException;
use Throwable;

class FooExceptionHandler extends ExceptionHandler
{
    public function handle(Throwable $throwable, ResponseInterface $response)
    {
        // 判断被捕获到的异常是希望被捕获的异常
        if ($throwable instanceof FooException) {
            // 格式化输出
            $data = json_encode([
                'code' => $throwable->getCode(),
                'msg'  => $throwable->getMessage(),
                'data' => $throwable->data,
            ], JSON_UNESCAPED_UNICODE);

            // 阻止异常冒泡
            $this->stopPropagation();
            return $response->withStatus(200)->withBody(new SwooleStream($data));
        }

        // 交给下一个异常处理器
        return $response;
    }

    /**
     * 判断该异常处理器是否要对该异常进行处理
     */
    public function isValid(Throwable $throwable): bool
    {
        return true;
    }
}

注册异常处理器config/autoload/exceptions.php

\App\Exception\Handler\FooExceptionHandler::class,

创建控制器

<?php
declare(strict_types=1);

namespace App\Controller;

use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
//use App\Exception\Handler\FooExceptionHandler;
use App\Exception\FooException;

class IndexController extends AbstractController
{
    public function index()
    {
        $msg = ['msg'=>'right!'];
        throw new FooException('ok', 200, $msg);
        return;
    }
}

参考http://blog.95shouyou.com/?id=18

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:hyperf中如何实现异常处理 出自老鄢博客 | 欢迎分享