@@ -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