使用Python在Tkinter中保存异常

时间:2016-07-19 16:55:32

标签: python tkinter

我为其他使用Tkinter接收用户输入的人开发了几个Python程序。为了保持简单和用户友好,命令行或python控制台永远不会启动(即使用.pyw文件),所以我正在研究使用日志库将错误文本写入文件时异常发生。但是,我很难让它真正捕获异常。例如:

我们编写一个会导致错误的函数:

def cause_an_error():
    a = 3/0

现在我们尝试正常记录错误:

import logging
logging.basicConfig(filename='errors.log', level=logging.ERROR)

try:
    cause_an_error()
except:
    logging.exception('simple-exception')

正如预期的那样,程序错误和日志记录将错误写入errors.log。控制台中没有任何内容。但是,当我们实现Tkinter接口时会有不同的结果,如下所示:

import logging
import Tkinter
logging.basicConfig(filename='errors.log', level=logging.ERROR)

try:
    root = Tkinter.Tk()
    Tkinter.Button(root, text='Test', command=cause_an_error).pack()
    root.mainloop()
except:
    logging.exception('simple-exception')

在这种情况下,按下Tkinter窗口中的按钮会导致错误。但是,这次没有任何内容写入文件,并且控制台中出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "C:/Users/samk/Documents/GitHub/sandbox/sandbox2.pyw", line 8, in cause_an_error
    a = 3/0
ZeroDivisionError: integer division or modulo by zero

是否有不同的方法来捕获并记录此错误?

1 个答案:

答案 0 :(得分:3)

它没有很好的文档记录,但是tkinter会调用一个方法来处理由于回调而发生的异常。您可以通过在根窗口上设置属性report_callback_exception来编写自己的方法来执行任何操作。

例如:

import tkinter as tk

def handle_exception(exception, value, traceback):
    print("Caught exception:", exception)

def raise_error():
    raise Exception("Sad trombone!")

root = tk.Tk()
# setup custom exception handling
root.report_callback_exception=handle_exception

# create button that causes exception
b = tk.Button(root, text="Generate Exception", command=raise_error)
b.pack(padx=20, pady=20)

root.mainloop()

供参考: