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
中的異常呢