在项目中我在events.php中来try catch错误
public static function onMessage($client_id, $message)
{
try {
$message = json_decode($message, true);
if (!is_array($message))
return Gateway::sendToCurrentClient(self::error(400, '参数类型错误'));
if ($message['type'] > 1000 and !isset($_SESSION['member_id'])) {
return Gateway::closeClient($client_id, self::error(400, '未登录'));
}
switch ($message['type']) {
case interview_admin_bind:
InterviewService::admin_bind($client_id, $message);
case bind:
MemberService::bind($client_id, $message);
break;
default :
return Gateway::sendToCurrentClient(self::success(1));
break;
}
} catch (Throwable $exception) {
var_dump($exception->getMessage());
var_dump($exception->getTrace());
if ($exception instanceof MyException) {
return Gateway::sendToCurrentClient(self::error($exception->type, $exception->getMessage(), $exception->getCode(), $exception->data));
} else {
return Gateway::sendToCurrentClient(self::error(400, $exception->getMessage()));
}
}
}
例如这样我来捕捉异常,但是notice错误捕获不了
即使开启了严格模式也不行,
declare(strict_types=1);
请问一下怎么才能让这个notice被try catch捕获到,因为我想任何情况下出现了任何错误,不论级别都走异常处理
想到一种解决办法就是自定义
set_error_handler方法来抛出异常
这样是能正确抛出异常的,把Notice错误弄成自定义的Exception异常
但是有一个问题就是 Crtl + C 退出的时候报了一堆错误
求解
还有一个这个报错,这个影响吗?
主要问题还是
这一句,虽然游泳,但是onClose的时候,因为我有一些数据是卸载redis和db中的,无论用户触发的onClose还是我中断Ctrl+C退出,都监听了onClose回调,去处理一些数据,所以如果报错的话就不应该,怎样顺滑的去处理那个报错呢?
看追踪是
断开链接>用户离开group>给group发送消息(有用户离开) 就是这一步发消息出现的问题
想到一个解决办法,既然是onClose里面调用了sendGroup方法报的错。
用户端断开链接我肯定要通知group里面的人,所以用senfGroup方法没问题也不会报错。
然后我服务端关闭服务用sendGroup方法会报错,但是我服务端其实主要是处理逻辑就行了,不需要用到sendGroup方法,不需要给用户发消息,把逻辑处理完就行了。
那么有没有办法判断是用户触发的onClose还是服务端Ctrl + C 触发的onClose呢?
要是能判断到服务端触发的onClose,那么我就不sendGroup不就行了?
walkor大佬解答一下?
或者说还是set_error_handler方法用错了?
我觉得好像后面这个办法好一点,判断服务端还是客服端触发的onClose更好
ctrl c 停止过程中的报错可以忽略吧。因为gateway进程可能都没了,然后还执行业务就报错了。
因为我有一部分数据写在redis中的,在onClose中需要去处理一下, 当然你说的也有道理,进程都没了,其实处不处理不重要了,但是现在遇到了报错肯定要想办法解决啊,身为一个程序员的操守 哈哈哈