mirror of
https://github.com/python/cpython.git
synced 2025-07-30 06:34:15 +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:
|
except:
|
||||||
exc = sys.exc_info()
|
exc = sys.exc_info()
|
||||||
if exc != (None, None, None):
|
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
|
@contextmanager
|
||||||
|
|
|
@ -146,6 +146,29 @@ class NestedTestCase(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
self.fail("Didn't raise ZeroDivisionError")
|
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):
|
def test_nested_b_swallows(self):
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def a():
|
def a():
|
||||||
|
|
|
@ -86,6 +86,9 @@ Extension Modules
|
||||||
Library
|
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
|
- Updated optparse module to Optik 1.5.1 (allow numeric constants in
|
||||||
hex, octal, or binary; add ``append_const`` action; keep going if
|
hex, octal, or binary; add ``append_const`` action; keep going if
|
||||||
gettext cannot be imported; added ``OptionParser.destroy()`` method;
|
gettext cannot be imported; added ``OptionParser.destroy()`` method;
|
||||||
|
@ -158,6 +161,9 @@ C API
|
||||||
Tests
|
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
|
- 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
|
- 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