2016-08-01 4 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インタプリタがキャッチされることはありません例外が発生したとき、それはエキサイティング前に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()の助けを借りて、標準出力するトレースバックを出力し、新しい機能を返します。 (ラッパー自体はfunctools.wrapsで装飾されており、生成されたラッパー関数、特に元の関数のドキュメントストリングが保持されます)。トレースバックをどこか別の場所に表示したい場合は、traceback.format_exc()に文字列を表示し、somwhereを表示/保存することができます。デコレータはまた、GUIツールキットがそれ自身のアクションを取る機会を得るように、通常は例外を飲み込むだけで、例外を再現します。

関連する問題