@@ -80,19 +80,41 @@ def __exit__(self, exc_type, exc_value, tb):
8080
8181
8282class _ScopeManager (object ):
83- def __init__ (self , hub , layer ):
83+ def __init__ (self , hub ):
8484 self ._hub = hub
85- self ._layer = layer
85+ self ._original_len = len (hub ._stack )
86+ self ._layer = hub ._stack [- 1 ]
8687
8788 def __enter__ (self ):
8889 scope = self ._layer [1 ]
8990 assert scope is not None
9091 return scope
9192
9293 def __exit__ (self , exc_type , exc_value , tb ):
93- layer = self ._hub .pop_scope_unsafe ()
94- assert layer [1 ] == self ._layer [1 ], "popped wrong scope"
95- if layer [0 ] != self ._layer [0 ]:
94+ current_len = len (self ._hub ._stack )
95+ if current_len < self ._original_len :
96+ logger .error (
97+ "Scope popped too soon. Popped %s scopes too many." ,
98+ self ._original_len - current_len ,
99+ )
100+ return
101+ elif current_len > self ._original_len :
102+ logger .warning (
103+ "Leaked %s scopes: %s" ,
104+ current_len - self ._original_len ,
105+ self ._hub ._stack [self ._original_len :],
106+ )
107+
108+ layer = self ._hub ._stack [self ._original_len - 1 ]
109+ del self ._hub ._stack [self ._original_len - 1 :]
110+
111+ if layer [1 ] != self ._layer [1 ]:
112+ logger .error (
113+ "Wrong scope found. Meant to pop %s, but popped %s." ,
114+ layer [1 ],
115+ self ._layer [1 ],
116+ )
117+ elif layer [0 ] != self ._layer [0 ]:
96118 warning = (
97119 "init() called inside of pushed scope. This might be entirely "
98120 "legitimate but usually occurs when initializing the SDK inside "
@@ -288,7 +310,7 @@ def push_scope(self, callback=None):
288310 new_layer = (client , copy .copy (scope ))
289311 self ._stack .append (new_layer )
290312
291- return _ScopeManager (self , new_layer )
313+ return _ScopeManager (self )
292314
293315 scope = push_scope
294316
0 commit comments