hyperf 如何在 websocket 服务器抛出异常,并且被异常处理器捕获到

websocket服务器中,我想在WebSocketController的onMessage方法抛出业务异常,然后统一由异常处理器整理输出。我的配置如下:

websocket控制器文件

class WebSocketController implements OnCloseInterface, OnMessageInterface, OnOpenInterface
{
       //省略了onClose和onOpen方法
    public function onMessage(WebSocketServer $server, Frame $frame): void
    {
        $server->push($frame->fd, 'Recv: ' . $frame->data);
        throw new ChatException(123);
    }
}

exceptions.php中的配置如下

return [
    'handler' => [
        "ws" => [
            App\Exception\Handler\ChatExceptionHandler::class,
        ],
    ],
];

ChatExceptionHandler.php是这么写的:

class ChatExceptionHandler extends ExceptionHandler
{
    //省略构造方法
    public function handle(Throwable $throwable, ResponseInterface $response)
    {
        $this->logger->warning(123);
    }

    public function isValid(Throwable $throwable): bool
    {
        return true;
    }
}

结果是异常信息不会被异常处理器ChatExceptionHandler捕获,而是直接在命令行输出:

PHP Fatal error:  Uncaught App\Exception\ChatException: 123 in /home/www/XXX/app/Controller/Chat/WebSocketController.php:30

请指点一下我如何在websocket服务器中抛出业务异常

李铭昕
最佳答案

file

websocket 底层没有设计通用捕获器,这里你先自己 try catch 吧

正常情况下,websocket 的捕获后的处理与 http 不太一致。

4年前 评论
加了sugar (楼主) 4年前
pan_zoe 3年前
讨论数量: 1
李铭昕

file

websocket 底层没有设计通用捕获器,这里你先自己 try catch 吧

正常情况下,websocket 的捕获后的处理与 http 不太一致。

4年前 评论
加了sugar (楼主) 4年前
pan_zoe 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!