Python スクリプトのクラッシュの原因を突き止めようとしています。
主な構造は次のとおりです。
def main()
try:
dostuff
except Exception as ex:
import traceback
tb = traceback.format_exc()
import platform
node = platform.node()
sendMail([DEBUG_EMAIL], "Alarm exception on %s" % node, str(tb), [])
このスタックトレースは、想定されているエラーメールではなく、メインのエラー処理で取得します。
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/__init__.py", line 799, in emit
stream.write(fs % msg.encode("UTF-8"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)
ロガーへのすべての書き込み呼び出しがtryブロック内にあることがわかりますが、例外ブロックを送信する電子メールでキャッチおよび処理されていないため、何かを見落としているようです。確認したところ、sendMail 関数は logging モジュールをまったく使用していません。したがって、例外は私の except-block で発生するべきではありません。
追加してみました
sys.tracebacklimit = 10
ファイルの先頭で、例外の発生場所を確認しますが、それは何にも影響しませんでした。そして今、問題の原因を見つける方法についてのアイデアがありません。
スクリプトは 1 時間に 1 回実行され、クラッシュするのは 1 週間に 1 回程度です。これは、入力データに関連するものだと思わせますが、それは dostuff() によってのみ処理されます。
アップデート:
スタックトレースが 1 行しか表示されない理由がわかりました。emit() の中でこれを見つけました。
try:
... doing stuff, something goes boom with encoding...
except UnicodeError:
stream.write(fs % msg.encode("UTF-8")) Here it goes Boom again
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record) Which means it ends up here
そして、handleError 関数の関連部分は次のようになります。
ei = sys.exc_info()
try:
traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
スタックトレースの最後の部分のみを出力します。