mirror of
https://github.com/python/cpython.git
synced 2025-07-31 23:23:11 +00:00
Fix contextlib.nested to cope with exit methods raising and handling exceptions
This commit is contained in:
parent
27ec1a773c
commit
da2268feec
3 changed files with 33 additions and 1 deletions
|
@ -127,7 +127,10 @@ def nested(*contexts):
|
|||
except:
|
||||
exc = sys.exc_info()
|
||||
if exc != (None, None, None):
|
||||
raise
|
||||
# Don't rely on sys.exc_info() still containing
|
||||
# the right information. Another exception may
|
||||
# have been raised and caught by an exit method
|
||||
raise exc[0], exc[1], exc[2]
|
||||
|
||||
|
||||
@contextmanager
|
||||
|
|
|
@ -146,6 +146,29 @@ class NestedTestCase(unittest.TestCase):
|
|||
else:
|
||||
self.fail("Didn't raise ZeroDivisionError")
|
||||
|
||||
def test_nested_right_exception(self):
|
||||
state = []
|
||||
@contextmanager
|
||||
def a():
|
||||
yield 1
|
||||
class b(object):
|
||||
def __enter__(self):
|
||||
return 2
|
||||
def __exit__(self, *exc_info):
|
||||
try:
|
||||
raise Exception()
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
with nested(a(), b()) as (x, y):
|
||||
1/0
|
||||
except ZeroDivisionError:
|
||||
self.assertEqual((x, y), (1, 2))
|
||||
except Exception:
|
||||
self.fail("Reraised wrong exception")
|
||||
else:
|
||||
self.fail("Didn't raise ZeroDivisionError")
|
||||
|
||||
def test_nested_b_swallows(self):
|
||||
@contextmanager
|
||||
def a():
|
||||
|
|
|
@ -86,6 +86,9 @@ Extension Modules
|
|||
Library
|
||||
-------
|
||||
|
||||
- Fixed contextlib.nested to cope with exceptions being raised and
|
||||
caught inside exit handlers.
|
||||
|
||||
- Updated optparse module to Optik 1.5.1 (allow numeric constants in
|
||||
hex, octal, or binary; add ``append_const`` action; keep going if
|
||||
gettext cannot be imported; added ``OptionParser.destroy()`` method;
|
||||
|
@ -158,6 +161,9 @@ C API
|
|||
Tests
|
||||
-----
|
||||
|
||||
- test_contextlib now checks contextlib.nested can cope with exceptions
|
||||
being raised and caught inside exit handlers.
|
||||
|
||||
- test_cmd_line now checks operation of the -m and -c command switches
|
||||
|
||||
- The test_contextlib test in 2.5a1 wasn't actually run unless you ran
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue