开启严格模式捕捉notice错误

qq823380606

在项目中我在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 退出的时候报了一堆错误
截图

求解

1443 3 0
3个回答

qq823380606

还有一个这个报错,这个影响吗?

截图

主要问题还是

    \set_error_handler(function ($type, $msg) {
        var_dump($type, $msg);
        throw new MyException(400, $msg);
    }, E_NOTICE);

这一句,虽然游泳,但是onClose的时候,因为我有一些数据是卸载redis和db中的,无论用户触发的onClose还是我中断Ctrl+C退出,都监听了onClose回调,去处理一些数据,所以如果报错的话就不应该,怎样顺滑的去处理那个报错呢?

看追踪是
断开链接>用户离开group>给group发送消息(有用户离开) 就是这一步发消息出现的问题

//监听onClose
public static function onClose($client_id)
{
    InterviewService::leave($client_id);
}

//用户离开的方法,去处理redis中的数据
 public static function leave($client_id)
{

    $interview_id = $_SESSION['interview_join'];

        unset($_SESSION['interview_join']);

        $room_key = "interview_room|id:$interview_id";

        $interview = Rdb::getInstance()->get($room_key, false);
        $interview = json_decode($interview, true);
        //*******doSomeThing
        Rdb::getInstance()->set($room_key, $interview, 18000);

        Gateway::leaveGroup($client_id, $room_key);
        Gateway::sendToGroup($room_key, self::success(interview_update, $interview));
        Gateway::sendToGroup($room_key, self::success(interview_member_leave, $member));

}

报错信息就是在sendToGroup这一步出现的,主要还是开启了那个set_error_handler方法,如果不设置set_error_handler就不会报错,求解啊。

还有只有服务端Ctrl + C 关闭服务才会报错,用户端主动调用leave方法或者用户端直接断开socket链接就不报错。!!!
  • 暂无评论
qq823380606

想到一个解决办法,既然是onClose里面调用了sendGroup方法报的错。
用户端断开链接我肯定要通知group里面的人,所以用senfGroup方法没问题也不会报错。
然后我服务端关闭服务用sendGroup方法会报错,但是我服务端其实主要是处理逻辑就行了,不需要用到sendGroup方法,不需要给用户发消息,把逻辑处理完就行了。

那么有没有办法判断是用户触发的onClose还是服务端Ctrl + C 触发的onClose呢?
要是能判断到服务端触发的onClose,那么我就不sendGroup不就行了?

walkor大佬解答一下?

或者说还是set_error_handler方法用错了?

我觉得好像后面这个办法好一点,判断服务端还是客服端触发的onClose更好

  • 暂无评论
静默

ctrl c 停止过程中的报错可以忽略吧。因为gateway进程可能都没了,然后还执行业务就报错了。

  • qq823380606 2021-01-14

    因为我有一部分数据写在redis中的,在onClose中需要去处理一下, 当然你说的也有道理,进程都没了,其实处不处理不重要了,但是现在遇到了报错肯定要想办法解决啊,身为一个程序员的操守 哈哈哈

年代过于久远,无法发表回答
🔝