国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

開啟嚴格模式捕捉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捕獲到,因為我想任何情況下出現(xiàn)了任何錯誤,不論級別都走異常處理

想到一種解決辦法就是自定義
set_error_handler方法來拋出異常
截圖
這樣是能正確拋出異常的,把Notice錯誤弄成自定義的Exception異常

但是有一個問題就是 Crtl + C 退出的時候報了一堆錯誤
截圖

求解

2110 3 0
3個回答

qq823380606

還有一個這個報錯,這個影響嗎?

截圖

主要問題還是

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

這一句,雖然游泳,但是onClose的時候,因為我有一些數據是卸載redis和db中的,無論用戶觸發(fā)的onClose還是我中斷Ctrl+C退出,都監(jiān)聽了onClose回調,去處理一些數據,所以如果報錯的話就不應該,怎樣順滑的去處理那個報錯呢?

看追蹤是
斷開鏈接>用戶離開group>給group發(fā)送消息(有用戶離開) 就是這一步發(fā)消息出現(xiàn)的問題

//監(jiān)聽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這一步出現(xiàn)的,主要還是開啟了那個set_error_handler方法,如果不設置set_error_handler就不會報錯,求解啊。

還有只有服務端Ctrl + C 關閉服務才會報錯,用戶端主動調用leave方法或者用戶端直接斷開socket鏈接就不報錯。!??!
  • 暫無評論
qq823380606

想到一個解決辦法,既然是onClose里面調用了sendGroup方法報的錯。
用戶端斷開鏈接我肯定要通知group里面的人,所以用senfGroup方法沒問題也不會報錯。
然后我服務端關閉服務用sendGroup方法會報錯,但是我服務端其實主要是處理邏輯就行了,不需要用到sendGroup方法,不需要給用戶發(fā)消息,把邏輯處理完就行了。

那么有沒有辦法判斷是用戶觸發(fā)的onClose還是服務端Ctrl + C 觸發(fā)的onClose呢?
要是能判斷到服務端觸發(fā)的onClose,那么我就不sendGroup不就行了?

walkor大佬解答一下?

或者說還是set_error_handler方法用錯了?

我覺得好像后面這個辦法好一點,判斷服務端還是客服端觸發(fā)的onClose更好

  • 暫無評論
法師

ctrl c 停止過程中的報錯可以忽略吧。因為gateway進程可能都沒了,然后還執(zhí)行業(yè)務就報錯了。

  • qq823380606 2021-01-14

    因為我有一部分數據寫在redis中的,在onClose中需要去處理一下, 當然你說的也有道理,進程都沒了,其實處不處理不重要了,但是現(xiàn)在遇到了報錯肯定要想辦法解決啊,身為一個程序員的操守 哈哈哈

年代過于久遠,無法發(fā)表回答
??