webman event插件emit处理任务时,使用了try carch是基于什么样的考虑?

lscho

问题描述

webman event插件emit处理任务,放到了try carch里面,并不是直接抛出异常。导致业务代码里无法捕获异常。

多个事件订阅时,其中一个发生异常,并没有影响到其它事件订阅,导致数据完整性失效。

例子

    Db::startTrans();
    try {
        $res = $info->save($data);
        if (!$res) {
            throw new \Exception("签约失败,请稍后再试", 1);
        }
        $info['ip'] = $request->getRealIp(true);
        // 触发成功事件
        Event::emit("checkin.handle.success", $info);

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

如上示例代码,checkin.handle.success的时间订阅有多个,其中一个发生异常,被插件内部catch掉,导致无论调试、还是回滚都很困难。

其他案例

为此我查看了 thinkphp 和 Laravel 的相关部分代码,均没有在内部直接 catch。

疑问

请问按照例子中的写法,如何在业务逻辑中正确捕获 Event::emit 中的异常呢

713 1 4
1个回答

walkor

考虑到不同模块间互不影响,尤其是在多应用或者多应用插件时,A应用处理时间发生异常不影响B应用。
这里可以考虑加个参数,允许抛出异常

  • walkor 2023-03-28

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

  • lscho 2023-03-28

    感谢大佬,这样方便多了

  • kspade 2023-11-04

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

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