2012-01-10 8 views
4

私はTwisterを使用してサーバーを構築しています。私はまた、サーバーのエラーログを維持しています。問題は、例外をスタック全体まで実行させると、現在の接続がクラッシュしてユーザーが切断されるため、他のすべてのものを取得する以外は明らかに私は裸を付けます。例外からのトレースバックを再発生せずに取得する

私が何かをキャッチしたら、トレースバックを文字列として取得して、どこにでも格納できるようにするか、プログラムをクラッシュさせてからPythonで印刷するようにしてください。

答えて

2

- しかし、重要なことは、ということですトレースバック情報そのものはモジュールsys上の "interpreter global"変数 - sys.exc_tracebackに格納されます。引用

:除く節のスイートが実行される前に

http://docs.python.org/reference/compound_stmts.html#try

は、 例外に関する詳細は、SYSモジュールに三つの変数に割り当てられている: sys.exc_typeは識別オブジェクトを受け取り例外; sys.exc_valueは例外のパラメータを受け取ります。 sys.exc_traceback は

あなたはexcept節内stdoutに印刷されたトレースバックを持っているtraceback.print_tbするパラメータとしてsys.exc_tracebackオブジェクトを渡すことができます...トレースバックオブジェクトを受け取ります。

+0

これは完璧です、ありがとうございます! – xanderflood

0

ええ、それにはmoduleがあります。 tracebackモジュールには、例外情報の出力や書式設定、または生のスタックフレームを返す関数が含まれています。

かなり洗練されたアプリケーションでは、私は実際には古くなった古いtraceback機能の代わりにログシステムを使用することをお勧めします。特に、方法logging.Logger.exceptionは、あなた(またはあなたのソフトウェアのユーザ)が設定したどのロギング先にも例外に関する情報を書き込みます。デフォルトのフォーマッタは、Pythonがコンソール上にあるようにトレースバックを出力しますが、Formatterを作成し、format_exceptionメソッドをオーバーライドすることで、例外の表示をカスタマイズすることができます。オーバーライドされたメソッドは、例外出力をフォーマットする必要がある場合は、traceback関数を呼び出す場所です。

1

、あなたがファイルへlog the tracebackできlogging module使用:トレースバックモジュールは、印刷およびトレースバック(examebleため、traceback.print_tb)を検査するためのいくつかのヘルパー関数が含まれてい

import logging 
logging.basicConfig(level = logging.DEBUG, filename = logfile) 
logger = logging.getLogger(__name__) 
try: 
    1/0 
except ZeroDivisionError as err: 
    logger.exception(err) 
1

はこれを試してみてください:トリックを行うと、あまりにも完全なスタックトレースを印刷する必要があり

import traceback, sys 

try: 
    # Do something that might raise an exception 
    open("/does not exist",'rb') 
except: 
    traceback.print_exc(file=sys.stderr) 
    # Or 
    traceback.print_exc(file=your_open_log_file) 

関連する問題