unraiseable hook is not needed. The REPL does:
>>> 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
if sys.excepthook is sys.__excepthook__:
print_exception()
else:
try:
sys.excepthook(*self.user_exc_info)
except:
print_exception()
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.
|