在項目中我在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 退出的時候報了一堆錯誤
求解
還有一個這個報錯,這個影響嗎?
主要問題還是
\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鏈接就不報錯。!??!
想到一個解決辦法,既然是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è)務就報錯了。
因為我有一部分數據寫在redis中的,在onClose中需要去處理一下, 當然你說的也有道理,進程都沒了,其實處不處理不重要了,但是現(xiàn)在遇到了報錯肯定要想辦法解決啊,身為一個程序員的操守 哈哈哈