繁体   English   中英

如何在mpl_connect()回调函数中显示错误消息

[英]How to display an error message in mpl_connect() callback function

我的理解是:通常,当发生错误时,它会通过所有调用函数丢弃,然后显示在控制台中。 现在,有些程序包会执行自己的错误处理,特别是与GUI相关的程序包通常根本不显示错误,而只是继续执行。

一般而言,我们如何覆盖这种行为? 编写GUI函数时,我希望看到错误! 我在这篇文章中找到了如何针对Tkinter进行说明的文章。 如何在Matplotlib中完成?

示例代码:

import matplotlib.pyplot as plt

def onclick(event):
    print(event.x, event.y)
    raise ValueError('SomeError') # this error is thrown but isn't displayed

fig = plt.figure(5)
fig.clf()

try: # if figure was open before, try to disconnect the button
    fig.canvas.mpl_disconnect(cid_button)
except:
    pass  
cid_button = fig.canvas.mpl_connect('button_press_event', onclick)

确实,当python解释器遇到从未捕获的异常时,它将在激发之前将所谓的回溯打印到stdout。 但是,GUI程序包通常捕获并吞并所有异常,以防止python解释器引起异常。 您想在某处显示该回溯,但对于GUI应用程序,则必须决定在何处显示该回溯。 标准库具有一个模块,可帮助您处理此类追溯,恰当地命名为traceback 然后,您将必须在GUI工具包执行之前捕获异常。 我不知道插入回调错误处理程序的一般方法,但是您可以手动为每个回调添加错误处理。 最好的方法是编写一个函数装饰器,然后将其应用于回调。

import traceback, functools

def print_errors_to_stdout(fun):
    @functools.wraps(fun)
    def wrapper(*args,**kw):
        try:
            return fun(*args,**kw)
        except Exception:
            traceback.print_exc()
            raise
    return wrapper

@print_errors_to_stdout
def onclick(event):
    print(event.x, event.y)
    raise ValueError('SomeError')

装饰器print_errors_to_stdout接受一个函数并返回一个新函数,该函数将原始函数嵌入try ... except块中,并在出现异常的情况下借助traceback.print_exc()将追溯打印到stdout。 (包装器本身用functools.wraps装饰,以便生成的包装器函数除其他外保留原始函数的文档字符串)。 如果您想在其他地方显示回溯, traceback.format_exc()会给您一个字符串,然后您可以在其中显示/存储某处。 装饰器还重新引发了异常,以便GUI工具包仍然有机会采取自己的行动,通常只是吞下异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM