通常未处理的异常到标准输出(或标准错误?),我建立一个应用程序,我想在关闭前通过这一信息的GUI,并显示给用户,并在同一时间,我想将它写入日志文件.所以,我需要一个带有异常全文的str.
我怎样才能做到这一点?
开始在python中编程我觉得在家里有错误报告.现在我正在使用Tkinter进行编程,我发现经常发生我的程序中存在错误,即使它们生成异常我也没注意到:我抓住它们(有时)因为我去调试Step by步骤(我使用wingIDE)并且例如在给定的行我看到报告的异常.但是令我恼火的是程序没有停止,但即使在不在 try/error 中的块中也会发生这种情况.
如果我说的话有意义,你知道一些至少显示错误的整体方法吗?在Tkinter中,我可以创建一个错误窗口,并在发生任何异常时填充它.
我在Python Tkinter中编写了一个应用程序.我最近注意到,对于其中一个操作,如果该操作失败,它有时会关闭(不会给出任何错误).我写了一个小程序来说明问题: -
import os
from Tkinter import *
def copydir():
src = "D:\\a\\x\\y"
dest = "D:\\a\\x\\z"
os.rename(src,dest)
master = Tk()
def callback():
global master
master.after(1, callback)
copydir()
print "click!"
b = Button(master, text="OK", command=copydir)
b.pack()
master.after(100, callback)
mainloop()
Run Code Online (Sandbox Code Playgroud)
要重现该问题,请在"ms命令提示符"中打开它将重命名的文件夹,以便重命名它将从Tkinter代码中引发异常.
我的原始代码是使用线程并且还在执行其他任务,因此我尝试使此测试脚本中的操作尽可能相似.
现在,如果我通过双击它来运行此代码,那么程序只需关闭而不会抛出任何错误.但是,如果我从控制台运行此脚本,那么异常消息将被转储到控制台上,至少我知道,出了点问题.
我可以通过在尝试重命名的代码中使用try/catch来修复此代码,但我也想告知用户这个失败.所以我只想知道在编写Tkinter App时应该遵循哪些编码方法,我想知道: -
1)每当用户双击它时,我可以让我的脚本在文件中转储一些堆栈跟踪.通过这个至少,我会知道一些错误并修复它.
2)我可以阻止tkinter应用程序退出此类错误并在某些TK对话框中抛出任何异常.
感谢帮助!!
在我的Tkinter Python应用程序中,我试图用来sys.excepthook处理未捕获的异常,但我的处理程序从未被调用过.堆栈跟踪仍然打印出来.
如何在Tkinter应用程序中处理未捕获的异常?
这是一个简单的例子,展示了我的尝试:
import Tkinter as tk
import tkMessageBox
import traceback
import sys
class MyApp(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.button_frame = tk.Frame(self)
self.button_frame.pack(side='top')
self.button_run = tk.Button(
self.button_frame, text="Run", command=self.run
)
self.button_run.grid(row=0, column=1, sticky='W')
def run(self):
tkMessageBox.showinfo('Info', 'The process is running.')
raise RuntimeError('Tripped.')
def main():
root = tk.Tk() # parent widget
MyApp(root).pack(fill='both', expand=True)
def handle_exception(exc_type, exc_value, exc_traceback):
message = ''.join(traceback.format_exception(exc_type,
exc_value,
exc_traceback))
tkMessageBox.showerror('Error', message)
sys.excepthook = handle_exception
root.mainloop() # enter …Run Code Online (Sandbox Code Playgroud) 我已经确定,在 Python TkInter GUI 程序中,最佳实践是将整个内容包含在 try / except 块中,以便捕获所有异常并将其呈现给最终用户(而不是默默地出现问题或程序似乎无缘无故地退出)。
然而,这种方法存在一些问题。考虑以下小程序,当单击按钮时,该程序会尝试除以 0:
import tkinter
class Foo():
def __init__(self):
# Initialize a new GUI window
root = tkinter.Tk()
# The "Generic error" message is shown when the following is uncommented
#number = 1 / 0
# Define a button and draw it
button = tkinter.Button(root, text='Generate an error', command=self.generate_error)
button.pack()
# Loop forever
root.mainloop()
def generate_error(self):
# The "Generic error" message is not shown
number = 1 / 0
if __name__ == …Run Code Online (Sandbox Code Playgroud)