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
{{ message }}
Repository navigation
code.InteractiveConsole can crash if sys.excepthook is broken #87320
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=Nonecreated_at=<Date2021-02-07.16:26:30.537>labels= ['type-bug', '3.10']
title='code.InteractiveConsole can crash if sys.excepthook is broken'updated_at=<Date2021-04-02.22:33:56.780>user='https://github.com/cfbolz'
When using code.InteractiveConsole to implement a Python shell (like PyPy is doing), having a broken sys.excepthook set can crash the console (see attached terminal log). Instead, it should catch errors and report then ignore them (using sys.unraisablehook I would think, but right now it's not that simple to call unraisablehook from python code).
>>> sys.excepthook =lambda: None
>>> 1/0
Error in sys.excepthook:
TypeError: <lambda>() takes 0 positional arguments but 3 were given
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> (no crash)
code.Console in the REPL currently does:
>>> import sys
>>> sys.excepthook =1
>>> arsdfsd
Error in sys.excepthook:
TypeError: 'int' object is not callable
Original exception was:
Traceback (most recent call last):
File "F:\dev\3x\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "<console>", line 1, in <module>
NameError: name 'arsdfsd' is not defined
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "F:\dev\3x\lib\code.py", line 301, in interact
console.interact(banner, exitmsg)
File "F:\dev\3x\lib\code.py", line 232, in interact
more = self.push(line)
File "F:\dev\3x\lib\code.py", line 258, in push
more = self.runsource(source, self.filename)
File "F:\dev\3x\lib\code.py", line 74, in runsource
self.runcode(code)
File "F:\dev\3x\lib\code.py", line 94, in runcode
self.showtraceback()
File "F:\dev\3x\lib\code.py", line 148, in showtraceback
sys.excepthook(ei[0], ei[1], last_tb)
TypeError: 'int' object is not callable
>>> (code console crashes, evidenced by 'sys'not recognized
IDLE in its normal 2-process mode, since 3 weeks ago, does:
>>> sys.excepthook =lambda: None
>>> 1/0
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Programs\Python310\lib\idlelib\run.py", line 576, in runcode
sys.excepthook(*self.user_exc_info)
TypeError: <lambda>() takes 0 positional arguments but 3 were given
>>> (no crash)
In IDLE's 1-process mode, selected with -n command line option, the hook exception has several IDLE specific lines added, as with the code exception. A return or two is needed to get >>> back.
In any case, both the immediate code exception and the defective hook exception are printed. The recent patch to IDLE, PR-24302, was to replace 'print_exception()' (ignoring excepthook) with
I suggest that the code line 148, call to sys.excepthook be wrapped similarly (adjusted to write the lines if sys.excepthook fails).
IDLE's exception order is determine by the default context annotation. I don't know what the REPL does to change the output, but I prefer the default. I will prepare a PR.
code tests are in test.test_code_module because test_code tests code objects.
code.InteractiveInterpreter handles SyntaxErrors separately in showsyntaxerror rather than showtraceback. The same problem arises with a bad excepthook in line 129.
Activity
cfbolz commentedon Feb 7, 2021
When using code.InteractiveConsole to implement a Python shell (like PyPy is doing), having a broken sys.excepthook set can crash the console (see attached terminal log). Instead, it should catch errors and report then ignore them (using sys.unraisablehook I would think, but right now it's not that simple to call unraisablehook from python code).
Related to https://bugs.python.org/issue43148
terryjreedy commentedon Feb 13, 2021
unraiseable hook is not needed. The REPL does:
code.Console in the REPL currently does:
IDLE in its normal 2-process mode, since 3 weeks ago, does:
In any case, both the immediate code exception and the defective hook exception are printed. The recent patch to IDLE, PR-24302, was to replace 'print_exception()' (ignoring excepthook) with
I suggest that the code line 148, call to sys.excepthook be wrapped similarly (adjusted to write the lines if sys.excepthook fails).
IDLE's exception order is determine by the default context annotation. I don't know what the REPL does to change the output, but I prefer the default. I will prepare a PR.
code tests are in test.test_code_module because test_code tests code objects.
terryjreedy commentedon Apr 2, 2021
code.InteractiveInterpreter handles SyntaxErrors separately in showsyntaxerror rather than showtraceback. The same problem arises with a bad excepthook in line 129.
cfbolz commentedon Jul 29, 2024
This issue is a little bit more pressing now with pyrepl, because that is based on the
codemodule. Here's Python 3.12:And Python 3.13 (I tried on current 3.13 branch, 10cf7d6):
pythongh-87320: dont crash in code module with bad sys.excepthook
gh-87320: In the code module, handle exceptions raised in sys.excepth…
pythongh-87320: In the code module, handle exceptions raised in sys.e…
[3.12] pythongh-87320: In the code module, handle exceptions raised i…
[3.12] gh-87320: In the code module, handle exceptions raised in sys.…
[3.13] gh-87320: In the code module, handle exceptions raised in sys.…
pythongh-87320: In the code module, handle exceptions raised in sys.e…