hyperf 六、异常处理

文章讲述了Hyperf框架中处理异常的方法,包括注册异常处理器、定义自定义异常类以及集成whoops错误处理框架。对比了php-fpm和swoole在处理请求和异常时的不同,强调在swoole中异常处理的重要性,因为它可能影响其他业务。同时,介绍了如何设置错误监听器ErrorExceptionHandler。
摘要由CSDN通过智能技术生成

文档地址:Hyperf

 控制器那篇文里提到过php-fpm和swoole的区别。

这是找到相关内容的文档:PHP教程:PHP-FPM與Swoole的比較

 根据文档:php-fpm每个请求一个worker,swoole请求由Reactor线程监听socket事件变化,业务都在worker里运行。比如tp的自定义命令中有报错时手动处理程序结束,之后的程序都不会执行。这种情况在php-fpm里正常,以为每个请求处理对应的程序,程序异常退出,顶多是这个请求对应的逻辑没执行完。在swoole里,从worker异常退出,其他有对应业务的请求都不会成功。即php-fpm在worker中异常结束仅本次请求,而swoole中影响其他业务。

这也是swoole一个woeker内多个业务请求内存共享的原因。

所以这个框架中异常处理,对正常运行的影响更为重要。

1、定义异常处理

        1.1 注册

        在config/autoload/exceptions.php文件中设置对应类。

// config/autoload/exceptions.php
return [
    'handler' => [
        // 这里的 http 对应 config/autoload/server.php 内的 server 所对应的 name 值
        'http' => [
            // 这里配置完整的类命名空间地址已完成对该异常处理器的注册
            \App\Exception\Handler\FooExceptionHandler::class,
        ],    
    ],
];

        1.2 定义

承抽象类 Hyperf\ExceptionHandler\ExceptionHandler 并实现其中的抽象方法。

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(),
                'message' => $throwable->getMessage(),
            ], JSON_UNESCAPED_UNICODE);

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

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

        // 或者不做处理直接屏蔽异常
    }

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

        1.3 触发

namespace App\Controller;

use App\Exception\FooException;

class IndexController extends AbstractController
{
    public function index()
    {
        throw new FooException('Foo Exception...', 800);
    }
}

2、集成whoops

composer require --dev filp/whoops

 composer地址:filp/whoops - Packagist

whoops是一个用于PHP的错误处理程序框架。

3、error监听

框架提供了 error_reporting() 错误级别的监听器 Hyperf\ExceptionHandler\Listener\ErrorExceptionHandler。

config/autoload/listeners.php中设置监听器。

return [
    \Hyperf\ExceptionHandler\Listener\ErrorExceptionHandler::class
];

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsswear

感谢大佬打赏 q(≧▽≦q)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值