mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
[3.5] bpo-29692: contextlib.contextmanager may incorrectly unchain RuntimeError (GH-949) (#1107)
contextlib._GeneratorContextManager.__exit__ includes a special case to deal with
PEP 479 RuntimeErrors created when `StopIteration` is thrown into the context
manager body.
Previously this check was too permissive, and undid one level of chaining on *all*
RuntimeError instances, not just those that wrapped a StopIteration instance.
(cherry picked from commit 00c75e9a45
)
This commit is contained in:
parent
c0f4240fac
commit
4d015a40a7
3 changed files with 32 additions and 6 deletions
|
@ -65,7 +65,7 @@ class _GeneratorContextManager(ContextDecorator):
|
|||
try:
|
||||
next(self.gen)
|
||||
except StopIteration:
|
||||
return
|
||||
return False
|
||||
else:
|
||||
raise RuntimeError("generator didn't stop")
|
||||
else:
|
||||
|
@ -87,7 +87,7 @@ class _GeneratorContextManager(ContextDecorator):
|
|||
# Likewise, avoid suppressing if a StopIteration exception
|
||||
# was passed to throw() and later wrapped into a RuntimeError
|
||||
# (see PEP 479).
|
||||
if exc.__cause__ is value:
|
||||
if type is StopIteration and exc.__cause__ is value:
|
||||
return False
|
||||
raise
|
||||
except:
|
||||
|
@ -98,10 +98,10 @@ class _GeneratorContextManager(ContextDecorator):
|
|||
# fixes the impedance mismatch between the throw() protocol
|
||||
# and the __exit__() protocol.
|
||||
#
|
||||
if sys.exc_info()[1] is not value:
|
||||
raise
|
||||
else:
|
||||
raise RuntimeError("generator didn't stop after throw()")
|
||||
if sys.exc_info()[1] is value:
|
||||
return False
|
||||
raise
|
||||
raise RuntimeError("generator didn't stop after throw()")
|
||||
|
||||
|
||||
def contextmanager(func):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue