4

Twisterを使用してサーバーを構築しています。サーバーエラーログも管理しています。問題は、例外をスタックの最後まで実行させると、現在の接続がクラッシュしてユーザーが切断されるため、他のすべてを取得する場合を除いて、明らかにベアをアタッチすることです。

何かを見つけたら、トレースバックを文字列として取得して、どこかに保存したり、プログラムがクラッシュしたときにPythonに出力させたりせずに、自分で印刷できるようにする方法はありますか?

4

4 に答える 4

2

トレースバックモジュールには、トレースバックを印刷および検査するためのいくつかのヘルパー関数が含まれています(たとえば、traceback.print_tb)。ただし、重要なことは、トレースバック情報自体がモジュールsysの「インタープリターグローバル」変数sys.exc_tracebackに格納されることです。 。

引用元:

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

例外句のスイートが実行される前に、例外に関する詳細がsysモジュールの3つの変数に割り当てられます。sys.exc_typeは、例外を識別するオブジェクトを受け取ります。sys.exc_valueは例外のパラメーターを受け取ります。sys.exc_tracebackはトレースバックオブジェクトを受け取ります。

sys.exc_tracebackオブジェクトをパラメーターとしてtraceback.print_tbに渡して、except句内でトレースバックをstdoutに出力させることができます。

于 2012-01-10T02:07:15.160 に答える
1

ロギングモジュールを使用して、トレースバックをファイルに記録できます。

import logging
logging.basicConfig(level = logging.DEBUG, filename = logfile)
logger = logging.getLogger(__name__)
try:
    1/0
except ZeroDivisionError as err:
    logger.exception(err)
于 2012-01-10T02:03:44.433 に答える
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 )

これでうまくいき、完全なスタックトレースも出力されます。

于 2012-01-10T02:12:00.420 に答える
0

はい、そのためのモジュールがあります。このtracebackモジュールには、例外情報を印刷またはフォーマットしたり、生のスタックフレームを返したりして、必要な処理を実行できるようにする関数が含まれています。

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

于 2012-01-10T02:03:07.227 に答える