每当我的 Tkinter 应用程序中出现错误时,我都希望通过程序当前所在的所有函数来获取错误发生位置的完整堆栈跟踪。
在我的根窗口打开之前,我有
Tk.report_callback_exception = TKINTERERROR
并且我能够在 TKINTERERROR()
中获取错误的回溯对象。但是,当我尝试打印回溯(使用 traceback.format_list(traceback.extract_tb(tracebackObject)))
时,它只提供最近的函数调用以及发生错误的行。这是否是 Tkinter 异常的全部可能,或者有没有办法获得整个堆栈跟踪?
详细来说,我期望得到的是这样的,其中给出了程序当前所在的所有函数:
Traceback (most recent call last):
File "myfilepath", line 13, in <module>
func1()
File "myfilepath", line 2, in func1
func2()
File "myfilepath", line 5, in func2
func3()
File "myfilepath", line 8, in func3
func4()
File "myfilepath", line 11, in func4
0/0
ZeroDivisionError: division by zero
然而,我实际上只得到这个:
File "...Python311\Lib\tkinter\__init__.py", line 1948, in __call__
return self.func(*args)
^^^^^^^^^^^^^^^^
File "myfilepath.py", line 1898, in <lambda>
widgetMethod(arguments, command = lambda: MyFunction(arguments))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "myfilepath", line 2465, in MyFunction
0/0
~^~
我的问题是我想获得完整的堆栈跟踪,但我只得到最近调用的函数。
这可以通过重新定义默认的 TKINTERERROR() 函数来完成:
from tkinter import *
import traceback
#These arguments are supplied automatically and must be here
def TKINTERERROR(tkinterLibrary, errorClass, finalErrorMessage, tracebackObject):
'''Prints stack trace of Tkinter error and enters Python debugger.'''
print('\n' + str(errorClass) + ':\n' + traceback.format_exc() + '\n' + str(finalErrorMessage) + '\n')
import pdb; pdb.post_mortem(tracebackObject)