@@ -99,3 +99,61 @@ def test_root_logger_handler_increments_for_distinct_logger(metrics):
99
99
finally :
100
100
root_logger .removeHandler (handler )
101
101
root_logger .setLevel (original_level )
102
+
103
+
104
+ # --- Exception handling tests ---
105
+ class DummyMetrics :
106
+ def __init__ (self ):
107
+ self .calls = 0
108
+
109
+ def increment (self , * _ , ** __ ):
110
+ self .calls += 1
111
+ raise RuntimeError ("increment failed" )
112
+
113
+
114
+ class SpyMetricsLoggingHandler (MetricsLoggingHandler ):
115
+ def __init__ (self , * args , ** kwargs ):
116
+ super ().__init__ (* args , ** kwargs )
117
+ self .handled = []
118
+
119
+ def handleError (self , record ): # noqa: N802 (match logging API)
120
+ self .handled .append (record )
121
+
122
+
123
+ def test_handler_handles_increment_exception_without_raising ():
124
+ logger = logging .getLogger ("test_logger_exception" )
125
+ logger .setLevel (logging .DEBUG )
126
+ logger .propagate = False
127
+
128
+ dummy_metrics = DummyMetrics ()
129
+ handler = SpyMetricsLoggingHandler (dummy_metrics )
130
+ logger .addHandler (handler )
131
+
132
+ # Should not raise despite metrics increment failing
133
+ logger .error ("trigger exception in metrics" )
134
+
135
+ assert len (handler .handled ) == 1
136
+ assert dummy_metrics .calls == 1
137
+
138
+ logger .removeHandler (handler )
139
+
140
+
141
+ def test_root_logger_exception_handling_with_distinct_logger ():
142
+ root_logger = logging .getLogger ()
143
+ original_level = root_logger .level
144
+
145
+ dummy_metrics = DummyMetrics ()
146
+ handler = SpyMetricsLoggingHandler (dummy_metrics )
147
+
148
+ try :
149
+ root_logger .setLevel (logging .DEBUG )
150
+ root_logger .addHandler (handler )
151
+
152
+ distinct_logger = logging .getLogger ("distinct.logger.exception" )
153
+ distinct_logger .info ("trigger info path exception" )
154
+
155
+ assert len (handler .handled ) == 1
156
+ assert dummy_metrics .calls == 1
157
+ finally :
158
+ root_logger .removeHandler (handler )
159
+ root_logger .setLevel (original_level )
0 commit comments