webman event插件emit處理任務(wù),放到了try carch里面,并不是直接拋出異常。導(dǎo)致業(yè)務(wù)代碼里無法捕獲異常。
多個事件訂閱時,其中一個發(fā)生異常,并沒有影響到其它事件訂閱,導(dǎo)致數(shù)據(jù)完整性失效。
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ā)生異常,被插件內(nèi)部catch掉,導(dǎo)致無論調(diào)試、還是回滾都很困難。
為此我查看了 thinkphp 和 Laravel 的相關(guān)部分代碼,均沒有在內(nèi)部直接 catch。
請問按照例子中的寫法,如何在業(yè)務(wù)邏輯中正確捕獲 Event::emit
中的異常呢