Skip to content

Commit 21081f4

Browse files
committed
fix(sentry): 优化before_send逻辑以过滤无堆栈信息的错误及特定无害异常
1 parent 0e0f41c commit 21081f4

1 file changed

Lines changed: 40 additions & 17 deletions

File tree

main.py

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,49 @@ def create_sentry_before_send_filter():
5050
"""
5151

5252
def before_send(event, hint):
53-
if "exception" not in event:
53+
# 1. 检查是否有堆栈信息
54+
has_stacktrace = False
55+
if "exception" in event:
56+
values = event.get("exception", {}).get("values", [])
57+
for val in values:
58+
if val.get("stacktrace"):
59+
has_stacktrace = True
60+
break
61+
62+
if not has_stacktrace and "threads" in event:
63+
values = event.get("threads", {}).get("values", [])
64+
for val in values:
65+
if val.get("stacktrace"):
66+
has_stacktrace = True
67+
break
68+
69+
# 检查 loguru 的 log_record
70+
log_record = hint.get("log_record")
71+
if log_record:
72+
if getattr(log_record, "exception", None):
73+
has_stacktrace = True
74+
elif hasattr(log_record, "extra") and log_record.extra.get("exc_info"):
75+
has_stacktrace = True
76+
77+
# 如果没有堆栈信息,且是错误/严重级别,则丢弃 (logger.info 等低级别不会被丢弃,除非 event_level 设置)
78+
if not has_stacktrace and event.get("level") in ("error", "fatal"):
5479
return None
5580

56-
exceptions = event.get("exception", {}).get("values", [])
57-
if not exceptions:
58-
return None
59-
60-
for exc in exceptions:
61-
module = exc.get("module", "")
62-
type_ = exc.get("type", "")
63-
value = exc.get("value", "")
64-
65-
if module.startswith("qfluentwidgets"):
66-
return None
81+
# 2. 过滤特定的错误类型或模块
82+
if "exception" in event:
83+
exceptions = event.get("exception", {}).get("values", [])
84+
for exc in exceptions:
85+
module = exc.get("module", "")
86+
type_ = exc.get("type", "")
87+
value = exc.get("value", "")
6788

68-
if type_ == "RuntimeError" and "Internal C++ object" in str(value):
69-
return None
89+
# 过滤 Qt 常见无害错误 (通常是由于对象在 C++ 侧已销毁但 Python 侧仍在尝试访问)
90+
if type_ == "RuntimeError" and ("Internal C++ object" in str(value) or "has been deleted" in str(value)):
91+
return None
7092

71-
if type_ == "COMError" and "没有注册类" in str(value):
72-
return None
93+
# 过滤 COM 相关
94+
if type_ == "COMError" and "没有注册类" in str(value):
95+
return None
7396

7497
return event
7598

@@ -83,7 +106,7 @@ def initialize_sentry():
83106
integrations=[
84107
LoguruIntegration(
85108
level=LoggingLevels.INFO.value,
86-
event_level=LoggingLevels.CRITICAL.value,
109+
event_level=LoggingLevels.ERROR.value,
87110
),
88111
],
89112
before_send=create_sentry_before_send_filter(),

0 commit comments

Comments
 (0)