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
中的异常呢
考虑到不同模块间互不影响,尤其是在多应用或者多应用插件时,A应用处理时间发生异常不影响B应用。
这里可以考虑加个参数,允许抛出异常
更新
composer require webman/event ^v1.0.4
,增加了dispatch方法,可以捕获异常感谢大佬,这样方便多了
dispatch方法 如何使用的 指点一下