File tree Expand file tree Collapse file tree 2 files changed +85
-13
lines changed Expand file tree Collapse file tree 2 files changed +85
-13
lines changed Original file line number Diff line number Diff line change 31
31
32
32
33
33
_client_init_debug = ContextVar ("client_init_debug" )
34
+ _client_in_capture_event = ContextVar ("client_in_capture_event" )
34
35
35
36
36
37
def _get_options (* args , ** kwargs ):
@@ -240,20 +241,29 @@ def capture_event(
240
241
241
242
:returns: An event ID. May be `None` if there is no DSN set or of if the SDK decided to discard the event for other reasons. In such situations setting `debug=True` on `init()` may help.
242
243
"""
243
- if self .transport is None :
244
+ is_recursive = _client_in_capture_event .get (False )
245
+ if is_recursive :
244
246
return None
245
- if hint is None :
246
- hint = {}
247
- rv = event .get ("event_id" )
248
- if rv is None :
249
- event ["event_id" ] = rv = uuid .uuid4 ().hex
250
- if not self ._should_capture (event , hint , scope ):
251
- return None
252
- event = self ._prepare_event (event , hint , scope )
253
- if event is None :
254
- return None
255
- self .transport .capture_event (event )
256
- return rv
247
+
248
+ _client_in_capture_event .set (True )
249
+
250
+ try :
251
+ if self .transport is None :
252
+ return None
253
+ if hint is None :
254
+ hint = {}
255
+ event_id = event .get ("event_id" )
256
+ if event_id is None :
257
+ event ["event_id" ] = event_id = uuid .uuid4 ().hex
258
+ if not self ._should_capture (event , hint , scope ):
259
+ return None
260
+ event_opt = self ._prepare_event (event , hint , scope )
261
+ if event_opt is None :
262
+ return None
263
+ self .transport .capture_event (event_opt )
264
+ return event_id
265
+ finally :
266
+ _client_in_capture_event .set (False )
257
267
258
268
def close (
259
269
self ,
Original file line number Diff line number Diff line change @@ -560,6 +560,68 @@ def __repr__(self):
560
560
)
561
561
562
562
563
+ def test_mapping_sends_exception (sentry_init , capture_events ):
564
+ sentry_init ()
565
+ events = capture_events ()
566
+
567
+ class C (Mapping ):
568
+ def __iter__ (self ):
569
+ try :
570
+ 1 / 0
571
+ except ZeroDivisionError :
572
+ capture_exception ()
573
+ yield "hi"
574
+
575
+ def __len__ (self ):
576
+ """List length"""
577
+ return 1
578
+
579
+ def __getitem__ (self , ii ):
580
+ """Get a list item"""
581
+ if ii == "hi" :
582
+ return "hi"
583
+
584
+ raise KeyError ()
585
+
586
+ try :
587
+ a = C () # noqa
588
+ 1 / 0
589
+ except Exception :
590
+ capture_exception ()
591
+
592
+ event , = events
593
+
594
+ assert event ["exception" ]["values" ][0 ]["stacktrace" ]["frames" ][0 ]["vars" ]["a" ] == {
595
+ "hi" : "'hi'"
596
+ }
597
+
598
+
599
+ def test_object_sends_exception (sentry_init , capture_events ):
600
+ sentry_init ()
601
+ events = capture_events ()
602
+
603
+ class C (object ):
604
+ def __repr__ (self ):
605
+ try :
606
+ 1 / 0
607
+ except ZeroDivisionError :
608
+ capture_exception ()
609
+ return "hi, i am a repr"
610
+
611
+ try :
612
+ a = C () # noqa
613
+ 1 / 0
614
+ except Exception :
615
+ capture_exception ()
616
+
617
+ event , = events
618
+
619
+ assert (
620
+ event ["exception" ]["values" ][0 ]["stacktrace" ]["frames" ][0 ]["vars" ]["a" ]
621
+ == "hi, i am a repr"
622
+ )
623
+
624
+
563
625
def test_errno_errors (sentry_init , capture_events ):
564
626
sentry_init ()
565
627
events = capture_events ()
You can’t perform that action at this time.
0 commit comments