[proxy] web.archive.org← back | site home | direct (HTTPS) ↗ | proxy home | ◑ dark◐ light
/ cpython Public
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-29692: contextlib.contextmanager may incorrectly unchain RuntimeError #949

Merged
merged 1 commit into from Apr 11, 2017

Conversation

Copy link
Contributor

soolabettu commented Apr 1, 2017

@ncoghlan @serhiy-storchaka @JelleZijlstra @brettcannon
I had to close PR 891 and open a new PR due to an incorrect rebase on my part.
All review comments made in PR 891 have been implemented and a test case added, please review, thanks.

Copy link

mention-bot commented Apr 1, 2017

@svelankar, thanks for your PR! By analyzing the history of the files in this pull request, we identified @ncoghlan, @berkerpeksag and @Yhg1s to be potential reviewers.

raise
if sys.exc_info()[1] is value:
return False
raise
else:
Copy link
Member

serhiy-storchaka Apr 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ncoghlan suggested to drop this else: clause.

@@ -152,6 +152,28 @@ def woohoo():
else:
self.fail('StopIteration was suppressed')

def test_contextmanager_do_not_unchain_non_stopiteration_exceptions(self):
code = """\
from __future__ import generator_stop
Copy link
Member

serhiy-storchaka Apr 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this needed in 3.7?

try:
yield
except Exception as exc:
raise RuntimeError from exc
Copy link
Member

serhiy-storchaka Apr 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add some argument to the raised RuntimeError for checking that the correct RuntimeError is caught.

with test_issue29692():
raise ZeroDivisionError
except Exception as ex:
self.assertIs(type(ex), RuntimeError)
Copy link
Member

serhiy-storchaka Apr 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check that this is a RuntimeError raised by test_issue29692, not some other RuntimeError. Check it's __cause__ (it should be ZeroDivisionError, right?).


try:
with test_issue29692():
raise ZeroDivisionError
Copy link
Member

serhiy-storchaka Apr 1, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if raise StopIteration? I think this case should be tested too.

Copy link
Member

serhiy-storchaka commented Apr 1, 2017

Please add an entry in Misc/NEWS at the start of the "Library" section. Don't forget "Patch by ."

soolabettu force-pushed the bpo-29692 branch 2 times, most recently from ecf5deb to 9538527 Compare Apr 2, 2017
Copy link
Contributor Author

soolabettu commented Apr 2, 2017

Implemented all changes, please review, thanks.

raise RuntimeError('issue29692:Chained') from exc
"""
locals = {}
exec(code, locals, locals)
Copy link
Member

serhiy-storchaka Apr 2, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since from __future__ import generator_stop no longer used, the trick with exec() no longer needed.

except Exception as ex:
self.assertIs(type(ex), StopIteration)
self.assertEqual(ex.args[0], 'issue29692:Unchained')
self.assertIs(ex.__cause__, None)
Copy link
Member

serhiy-storchaka Apr 2, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assertIsNone()

Misc/NEWS Outdated
@@ -303,6 +303,10 @@ Extension Modules
Library
-------

- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager
Copy link
Member

serhiy-storchaka Apr 2, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add periods after sentence ends.

Copy link
Contributor Author

soolabettu commented Apr 2, 2017

@serhiy-storchaka , thanks for the review.

Copy link
Contributor Author

soolabettu commented Apr 10, 2017

@ncoghlan could you please review the changes? Thanks

Copy link
Contributor

ncoghlan left a comment

Latest version looks good to me.

ncoghlan merged commit 00c75e9 into python:master Apr 11, 2017
Copy link
Contributor

ncoghlan commented Apr 11, 2017

Thanks for the fix, @svelankar!

Mariatta mentioned this pull request Apr 13, 2017
Mariatta pushed a commit to Mariatta/cpython that referenced this pull request Apr 13, 2017
…ntimeError (pythonGH-949)

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 00c75e9)
Mariatta added a commit that referenced this pull request Apr 13, 2017
…ntimeError (GH-949) (#1105)

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 00c75e9)
Mariatta pushed a commit to Mariatta/cpython that referenced this pull request Apr 13, 2017
…ntimeError (pythonGH-949)

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 00c75e9)
Mariatta added a commit that referenced this pull request Apr 13, 2017
…ntimeError (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 00c75e9)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants