Hrvoje Nikšić added the comment:

Here is the updated patch, with a very minor improvement (no longer 
unnecessarily holds on to original exc_info), and with new tests. The tests 
test for the non-suppression of exit-exception (which fails without the fix) 
and for the correct suppression of body-exception by an outer CM. It was not 
necessary to write a test for suppression of exit-exception, since this is 
already tested by test_exit_exception_chaining_suppress().

There is one problem, however: applying my patch mysteriously breaks the 
existing test_exit_exception_chaining(). It breaks in a peculiar way: the 
correct exception is propagated , but the exception's context is wrong. Instead 
of to KeyError, it points to ZeroDivisionError, despite its having been 
correctly suppressed.

I placed prints in _fix_exception_context right before assignment to 
__context__, to make sure it wasn't broken by my patch, and the assignment 
appears correct, it sets the context of IndexError to KeyError instance. The 
__context__ is correct immediately before the raise statement. However, after 
the IndexError is caught inside test_exit_exception_chaning(), its __context__ 
is unexpectedly pointing to ZeroDivisionError.

It would seem that the difference is in the raise syntax. The old code used 
"raise", while the new code uses "raise exc[1]", which I assume changes the 
exception's __context__. Changing "raise exc[1]" to "raise exc[1] from None" 
didn't help.

----------
Added file: http://bugs.python.org/file31897/exitstack.diff

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue19092>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to