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服务器中抛出业务异常
websocket 底层没有设计通用捕获器,这里你先自己 try catch 吧
正常情况下,websocket 的捕获后的处理与 http 不太一致。