[Python-checkins] r43304 - in python/trunk/Lib: contextlib.py test/test_contextlib.py
phillip.eby
python-checkins at python.org
Sat Mar 25 01:28:25 CET 2006
Author: phillip.eby
Date: Sat Mar 25 01:28:24 2006
New Revision: 43304
Modified:
python/trunk/Lib/contextlib.py
python/trunk/Lib/test/test_contextlib.py
Log:
Fix a problem with @contextmanager not detecting a broken generator
that yields after a throw(). Make @contextmanager not reraise
exceptions, but return a false value in that case instead. Add test
cases for both behaviors.
Modified: python/trunk/Lib/contextlib.py
==============================================================================
--- python/trunk/Lib/contextlib.py (original)
+++ python/trunk/Lib/contextlib.py Sat Mar 25 01:28:24 2006
@@ -30,9 +30,12 @@
else:
try:
self.gen.throw(type, value, traceback)
- return True
+ raise RuntimeError("generator didn't stop after throw()")
except StopIteration:
return True
+ except:
+ if sys.exc_info()[1] is not value:
+ raise
def contextmanager(func):
Modified: python/trunk/Lib/test/test_contextlib.py
==============================================================================
--- python/trunk/Lib/test/test_contextlib.py (original)
+++ python/trunk/Lib/test/test_contextlib.py Sat Mar 25 01:28:24 2006
@@ -45,6 +45,28 @@
self.fail("Expected ZeroDivisionError")
self.assertEqual(state, [1, 42, 999])
+ def test_contextmanager_no_reraise(self):
+ @contextmanager
+ def whee():
+ yield
+ ctx = whee().__context__()
+ ctx.__enter__()
+ # Calling __exit__ should not result in an exception
+ self.failIf(ctx.__exit__(TypeError, TypeError("foo"), None))
+
+ def test_contextmanager_trap_yield_after_throw(self):
+ @contextmanager
+ def whoo():
+ try:
+ yield
+ except:
+ yield
+ ctx = whoo().__context__()
+ ctx.__enter__()
+ self.assertRaises(
+ RuntimeError, ctx.__exit__, TypeError, TypeError("foo"), None
+ )
+
def test_contextmanager_except(self):
state = []
@contextmanager
More information about the Python-checkins
mailing list