2016-08-01 33 views
0

我的理解是:通常,當發生錯誤時,它通過所有調用函數拋出,然後顯示在控制檯中。現在有一些軟件包可以自己處理錯誤,特別是與GUI相關的軟件包通常不會顯示錯誤,只是繼續執行。如何在mpl_connect()回調函數中顯示錯誤消息

我們如何重寫這種行爲?當我編寫GUI功能時,我希望看到錯誤!我找到了this post這裏解釋瞭如何爲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) 

回答

1

事實上,在Python解釋器遇到從未捕獲的異常,它會打印一個所謂的回溯之前激動人心到標準輸出。但是,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()會給你一個字符串,然後你可以顯示/存儲somwhere。裝飾器也重新渲染異常,使得GUI工具包仍然有機會採取它自己的操作,通常只是吞噬異常。