
今回はtracebackについて。
Pythonソースのスタックトレースを出力には、tracebackモジュールを使えばよいようです。
■ tracebackモジュール
まずは今回テストする関数を作成。
単純に例外を起こすために、0除算のケースを作成してみます。
import traceback
def divide(a, b):
return a / b
try:
divide(2, 0)
except ZeroDivisionError:
print('ZeroDivisionError happened!')
traceback.print_exc()
「0」で除算すると「ZeroDivisionError」の例外が発生するので、これをキャッチ。
発生が分かるように、メッセージ出力と、トレースログを出してみます。
トレースロスは
traceback.print_exc()
を実行すればよいようです。
実際に実行してみると…
coublood@penguin:~/python$ python3 tracebk1.py
ZeroDivisionError happened!
Traceback (most recent call last):
File "/home/coublood/python/tracebk1.py", line 7, in <module>
divide(2, 0)
File "/home/coublood/python/tracebk1.py", line 4, in divide
return a / b
~~^~~
ZeroDivisionError: division by zero
メッセージも出ており、スタックトレースも出ていますね。
a / b で割る処理で出ているのが期待値で、呼び出し元も出ているので、期待通りです。
■ loggingモジュール
ついでに上記のエラーを特定のフォーマットでログ出力したいので、今度はログ出力について。
ログ出力はloggingモジュールで良いようです。
import traceback
import logging
logFileName = '/home/coublood/python/traceback1.log'
logFormat = '%(asctime)s %(levelname)s %(message)s'
logging.basicConfig(filename=logFileName, format=logFormat)
def divide(a, b):
return a / b
try:
divide(2, 0)
except ZeroDivisionError:
print('ZeroDivisionError happened!')
logging.error(traceback.format_exc())
basicConfig関数で引数等で色々と基本設定できるみたいで、それはマニュアルを参照すれば色々と載ってました。
coublood@penguin:~/python$ cat traceback.log
2024-12-31 21:25:22,850 ERROR Traceback (most recent call last):
File "/home/coublood/python/tracebk1.py", line 12, in <module>
divide(2, 0)
File "/home/coublood/python/tracebk1.py", line 9, in divide
return a / b
~~^~~
ZeroDivisionError: division by zero
時間も簡単に出せるので、ロガーとして全然これで十分ですね。
[blog:g:8599973812282040707:banner]
[blog:g:11696248318756355058:banner]
[blog:g:11696248318754550880:banner]