2

私はPyQt4ユーザーインターフェイスを使用しています。簡単なデバッグとトラブルシューティングのためにstderrをログファイルにリダイレクトしましたが、エラーが発生したときにエラーメッセージを表示する必要があります。まだログを残している間にユーザーにエラーを表示する方法はありますか?

問題が発生したときに例外をキャッチし、発生したことをユーザーに通知する必要がありますが、トレースバックがstderr(つまりログファイル)に伝播されるようにする必要があります。私はこのような何か行うと

def updateResults(self): 
    try: 
     #code that updates the results 
    except: 
     #display error message box 

をこれは、例外をキャッチし、エラーログにpropogateません。

ユーザーにメッセージを表示してエラーを伝える方法はありますか?

これは機能しますか?

except, e: 
    #display error message box 
    raise e 

私の目標を達成する良い方法はありますか?

答えて

6

私はあなたが間違った方法でこれについて考えていると思います。あなたは単に行の下にそれを記録するためにエラーを再発生させるべきではありません。 Pythonでこれを行うための標準的な方法は、ロギングモジュールを使用することです。ドキュメントから適応:

import logging 
LOG_FILENAME = '/tmp/logging_example.out' 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,) 

... 

try: 
    # code 
except: 
    logging.debug('Something bad happened', exc_info=True) 
    # display message box 
    # raise (if necessary) 

これはsys.stdoutの上に作らエラーに頼るよりもはるかに柔軟なロギングシステムを提供します。例外から何らかの形で回復できる場合は、例外を再発行する必要はありません。

+0

今後のプロジェクトではこのメソッドを使用します。今すぐpy2exeは 'stderr'のリダイレクトを行っていますので、*私はすべての*関数の周りにtry-exceptブロックを持つようにリファクタリングしない限り、2つのログファイル(捕捉された例外と捕捉されない例外)で終わります。 – tgray

+0

基本的に、このメソッドを実装する利点は、* this *プロジェクトのリファクタリング時間に値するものではありません。 – tgray

+0

キャッチされた/キャッチされない例外を切り離したいということを心に留めてください(tgray)。 Antに記述されているロギングスキーマが最適です。なぜなら、ファイルにログを記録したり、データベースにログを記録したり、ファイルとデータベースにログすることさえでき、あらゆる場所でコードを変更する必要がないからです。 – DevinB

3

正確に、しかし、あなたのことができちょうど

現在処理の例外を再発生させます
raise 

1

いくつかの追加情報:

(PyQt4付き)あなたはまた、すべてのキャッチされない例外をキャッチするために、独自の機能にsys.excepthookを再バインドする必要があります。それ以外の場合、PyQtはコンソールに出力するだけで、必要なものではない場合があります。

import sys 

def excepthook(exc_type, exc_val, tracebackobj): 
    # do something useful with the uncaught exception 
    ... 

def main(): 
    # rebind excepthook 
    sys.excepthook = excepthook 
    ... 
+0

実際、py2exeはこれを自動的に処理して "program.exe.log"ファイルを作成します。 – tgray

+0

しかし、py2exeにバンドルされていないアプリケーションを作成したことがあるかどうかを知っておくとよいでしょう。 – tgray

関連する問題