You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
code.InteractiveConsole doesn't match the CPython interactive interpreter with respect to allowing sys.excepthook to handle exceptions. Unlike the interactive interpreter, replacing sys.excepthook with an alternate function will not change exception handling behaviour from inside a code.InteractiveConole
OK. Not something I was expecting to be asked. But cool :D
If it's not possible for InteractiveConsole to allow exceptions to propagate through sys.excepthook. (I assume they are being caught in a try: catch: block) check sys.excepthook for a custom exception handler and call present.
As InteractiveConsole is supposed to "Closely emulate the behaviour of the interactive Python interpreter", any existing code that replies on it's current could be viewed as relying on a bug.
I'd be happy to attempt a patch if it's worthwhile preparing one.
If someone is setting sys.excepthook, they are not expecting it to be ignored, so I think there's no reason to preserve existing behaviour. On the other hand, it is easy to customize exception printout by subclassing InteractiveConsole and overriding the showtraceback() method.
Another possibility yet is to add an "excepthook" argument to the InteractiveInterpreter / InteractiveConsole constructors.
aliles commented on Aug 20, 2012
alilesmannequin
MannequinAuthor
More actions
Submitted patch. Patch creates a new unit test suite with basic unit tests for InteractiveConsole. Enhances InteractiveConsole to call sys.excepthook instead of it's own handler if the user has overridden the excepthook.
The unit tests use the new unittest.mock module and ExitStack class for contextlib.
aliles commented on Aug 20, 2012
alilesmannequin
MannequinAuthor
More actions
New patch to address comments provide by Nick Coghlan in person at PyCon-AU 2012.
The patch also adds a test suite for the code module, in order to demonstrate that the issue is actually fixed.
However, due to the interactive nature of the component, the new tests rely on unittest.mock. Backporting the test suite would mean eliminating that dependency (which is doable, but somewhat tedious).
So we can either leave the issue open, indicating that a backport of the tests and change to 2.7 (and perhaps 3.2) is still acceptable, or else declare that we aren't going to worry about that and just leave this as something that is only supported properly in 3.3+
Activity
aliles commentedon Jul 27, 2011
code.InteractiveConsole doesn't match the CPython interactive interpreter with respect to allowing sys.excepthook to handle exceptions. Unlike the interactive interpreter, replacing sys.excepthook with an alternate function will not change exception handling behaviour from inside a code.InteractiveConole
This affects downstream interpreters such as PyPy.
https://bugs.pypy.org/issue811
vstinner commentedon Jul 27, 2011
What do you suggest?
aliles commentedon Jul 27, 2011
OK. Not something I was expecting to be asked. But cool :D
If it's not possible for InteractiveConsole to allow exceptions to propagate through sys.excepthook. (I assume they are being caught in a try: catch: block) check sys.excepthook for a custom exception handler and call present.
As InteractiveConsole is supposed to "Closely emulate the behaviour of the interactive Python interpreter", any existing code that replies on it's current could be viewed as relying on a bug.
I'd be happy to attempt a patch if it's worthwhile preparing one.
vstinner commentedon Jul 27, 2011
Ok, I was not sure that I understood correctly. This change should be an option to not break existing code.
aliles commentedon Jul 27, 2011
Yes. I have code that behaves differently under CPython and PyPy because of this issue.
Admittedly that code is somewhat evil. It's attached for reference, in particular the __HelpSyntax class.
pitrou commentedon Jul 29, 2011
If someone is setting sys.excepthook, they are not expecting it to be ignored, so I think there's no reason to preserve existing behaviour. On the other hand, it is easy to customize exception printout by subclassing InteractiveConsole and overriding the showtraceback() method.
aliles, if you want to work on a patch, we have a developer's guide at http://docs.python.org/devguide/.
pitrou commentedon Jul 29, 2011
Another possibility yet is to add an "excepthook" argument to the InteractiveInterpreter / InteractiveConsole constructors.
aliles commentedon Aug 20, 2012
Submitted patch. Patch creates a new unit test suite with basic unit tests for InteractiveConsole. Enhances InteractiveConsole to call sys.excepthook instead of it's own handler if the user has overridden the excepthook.
The unit tests use the new unittest.mock module and ExitStack class for contextlib.
aliles commentedon Aug 20, 2012
New patch to address comments provide by Nick Coghlan in person at PyCon-AU 2012.
python-dev commentedon Aug 20, 2012
New changeset a812de69b493 by Nick Coghlan in branch 'default':
Issue bpo-12643: Respect sys.excepthook in code.InteractiveConsole
http://hg.python.org/cpython/rev/a812de69b493
asvetlov commentedon Aug 20, 2012
Is it finished or not?
Also looks like patch applied to 3.3 while issue marked for 2.7 and 3.2 also.
ncoghlan commentedon Aug 20, 2012
The patch also adds a test suite for the code module, in order to demonstrate that the issue is actually fixed.
However, due to the interactive nature of the component, the new tests rely on unittest.mock. Backporting the test suite would mean eliminating that dependency (which is doable, but somewhat tedious).
So we can either leave the issue open, indicating that a backport of the tests and change to 2.7 (and perhaps 3.2) is still acceptable, or else declare that we aren't going to worry about that and just leave this as something that is only supported properly in 3.3+
asvetlov commentedon Aug 20, 2012
I'm ok with current status.
Thanks for clarification.
berkerpeksag commentedon Sep 12, 2016
3.2 is now dead and it's probably not worth to backport tests to 2.7 in 2016 :) Closing this as 'fixed'.