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

webman event插件emit處理任務時,使用了try carch是基于什么樣的考慮?

lscho

問題描述

webman event插件emit處理任務,放到了try carch里面,并不是直接拋出異常。導致業(yè)務代碼里無法捕獲異常。

多個事件訂閱時,其中一個發(fā)生異常,并沒有影響到其它事件訂閱,導致數據完整性失效。

例子

    Db::startTrans();
    try {
        $res = $info->save($data);
        if (!$res) {
            throw new \Exception("簽約失敗,請稍后再試", 1);
        }
        $info['ip'] = $request->getRealIp(true);
        // 觸發(fā)成功事件
        Event::emit("checkin.handle.success", $info);

        Db::commit();
    } catch (\Throwable $th) {
        //throw $th;
        Db::rollback();
        return $this->error("處理失敗:" . $th->getMessage());
    }

如上示例代碼,checkin.handle.success的時間訂閱有多個,其中一個發(fā)生異常,被插件內部catch掉,導致無論調試、還是回滾都很困難。

其他案例

為此我查看了 thinkphp 和 Laravel 的相關部分代碼,均沒有在內部直接 catch。

疑問

請問按照例子中的寫法,如何在業(yè)務邏輯中正確捕獲 Event::emit 中的異常呢

1359 1 4
1個回答

walkor 打賞

考慮到不同模塊間互不影響,尤其是在多應用或者多應用插件時,A應用處理時間發(fā)生異常不影響B(tài)應用。
這里可以考慮加個參數,允許拋出異常

  • walkor 2023-03-28

    更新 composer require webman/event ^v1.0.4,增加了dispatch方法,可以捕獲異常

  • lscho 2023-03-28

    感謝大佬,這樣方便多了

  • kspade 2023-11-04

    dispatch方法 如何使用的 指點一下

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