格式统一
This commit is contained in:
@ -51,12 +51,28 @@ class EventBus:
|
||||
"""发布事件,通知所有订阅者。订阅者异常不再静默吞掉,而是输出 traceback。
|
||||
|
||||
迭代订阅者列表的副本,防止回调中调用 unsubscribe() 导致跳过后续订阅者。
|
||||
|
||||
2026-07-01 修复:捕获 RuntimeError(sip 野指针异常)防止已删除的 C++ 对象回调崩溃。
|
||||
"""
|
||||
with self._lock:
|
||||
snapshot = list(self._subscribers.get(event_name, []))
|
||||
for callback in snapshot:
|
||||
try:
|
||||
callback(data)
|
||||
except RuntimeError:
|
||||
# ★ 野指针保护:C++ 对象已删除时 sip 抛出 RuntimeError,静默跳过。
|
||||
cb_name = getattr(callback, '__name__', None) or repr(callback)
|
||||
err_msg = (
|
||||
f"[EventBus] 事件 '{event_name}' 的订阅者 {cb_name!r} C++ 对象已销毁,跳过。\n"
|
||||
+ traceback.format_exc()
|
||||
)
|
||||
if self._error_logger:
|
||||
try:
|
||||
self._error_logger(err_msg)
|
||||
except Exception:
|
||||
print(err_msg, file=sys.stderr, flush=True)
|
||||
else:
|
||||
print(err_msg, file=sys.stderr, flush=True)
|
||||
except Exception:
|
||||
cb_name = getattr(callback, '__name__', None) or repr(callback)
|
||||
err_msg = (
|
||||
|
||||
Reference in New Issue
Block a user