Pythonでエラーが発生しない状態でもStackTraceを表示させる方法

今回はPythonでExceptionが発生しない状態でもStackTraceを表示させる方法についてご紹介いたします。



Pythonでエラーが発生しない状態でもStackTraceを表示させる方法

Exceptionが発生しないときでもStackTraceを表示させたいときはありませんか?
実はtracebackモジュールを使えばExceptionが発生しない条件でもStackTraceを表示させることが可能なのです。
デバッグができないプロジェクトなどに非常に役に立ちます。

使い方の例としては、次の「main.py」、「sub1.py」、「sub2.py」、「sub3.py」の4つのファイルがあるとしましょう。

main.pyではsub1.pyのsub1funcを呼び出し、sub1.pyではsub2.pyのsub2funcを呼び出し、sub2.pyではsub3.pyのsub3funcを呼び出しています。

sub3.pyのsub3funcに注目してください。
tracebackモジュールをインポートして
print(“”.join(traceback.format_stack()))
で出力していることが見て取れると思います。

このtraceback.format_stack()がStackTraceを呼び出すための関数です。
なぜjoinして出力しているかについては後でご説明いたします。

それではこれを実行してみましょう。
実行結果は以下になります。

上部にStackTraceが出ていることが分かりますね。
下にある
test
Sub1 passed
sub2 passed
sub3 passed
はプログラム自体の実行結果ですが、その上にStackTraceが出力されていることが分かると思います。

main.pyでsub1.pyのsub1funcを呼び出し、sub1.pyでsub2funcを呼び出し……という過程がしっかり出力されていることが分かると思います。
ロガーで差し込んだりすれば、デバッグができない環境でもこのようにStackTraceを出力させることが可能です。

さて、話が戻りますがなぜtraceback.format_stack()を空文字でjoinしているのかについてご説明します。
なぜjoinをするかというと、traceback.format_stack()はたどってきたファイルについての情報をリストで返却するからです。
joinをしなかったときの実行結果は次のようになります。

ちょっと分かりにくいですね。
視覚的に分かりやすくするためにも、リストをくっつけるjoin関数を使って出力させることをおすすめします。

終わりに

今回はPythonでExceptionが発生しない状態でもStackTraceを表示させる方法についてご紹介いたしました。

最後までお読みいただきありがとうございます。
よろしければブログやTwitterでのシェアをお願いいたします。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。






Python

Posted by ちこ