Pythonでエラーが発生しない状態でもStackTraceを表示させる方法
今回はPythonでExceptionが発生しない状態でもStackTraceを表示させる方法についてご紹介いたします。
Pythonでエラーが発生しない状態でもStackTraceを表示させる方法
Exceptionが発生しないときでもStackTraceを表示させたいときはありませんか?
実はtracebackモジュールを使えばExceptionが発生しない条件でもStackTraceを表示させることが可能なのです。
デバッグができないプロジェクトなどに非常に役に立ちます。
使い方の例としては、次の「main.py」、「sub1.py」、「sub2.py」、「sub3.py」の4つのファイルがあるとしましょう。
1 2 3 4 5 6 |
# main.py import sub1 testString = '\ntest' print(sub1.sub1func(testString)) |
1 2 3 4 5 6 7 8 |
# sub1.py import sub2 def sub1func(testString): testString += '\nSub1 passed' return sub2.sub2func(testString) |
1 2 3 4 5 6 7 |
# sub2.py import sub3 def sub2func(testString): testString += '\nsub2 passed' return sub3.sub3func(testString) |
1 2 3 4 5 6 7 8 9 |
# sub3.py import traceback def sub3func(testString): testString += '\nsub3 passed' print("".join(traceback.format_stack())) return testString |
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して出力しているかについては後でご説明いたします。
それではこれを実行してみましょう。
実行結果は以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3 /Users/chico27/github/python-test1/main.py File "/Users/chico27/github/python-test1/main.py", line 5, in <module> print(sub1.sub1func(testString)) File "/Users/chico27/github/python-test1/sub1.py", line 15, in sub1func return sub2.sub2func(testString) File "/Users/chico27/github/python-test1/sub2.py", line 5, in sub2func return sub3.sub3func(testString) File "/Users/chico27/github/python-test1/sub3.py", line 6, in sub3func print("".join(traceback.format_stack())) test Sub1 passed sub2 passed sub3 passed |
上部に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をしなかったときの実行結果は次のようになります。
1 2 3 4 5 6 7 |
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3 /Users/chico27/github/python-test1/main.py [' File "/Users/chico27/github/python-test1/main.py", line 6, in <module>\n print(sub1.sub1func(testString))\n', ' File "/Users/chico27/github/python-test1/sub1.py", line 16, in sub1func\n return sub2.sub2func(testString)\n', ' File "/Users/chico27/github/python-test1/sub2.py", line 7, in sub2func\n return sub3.sub3func(testString)\n', ' File "/Users/chico27/github/python-test1/sub3.py", line 7, in sub3func\n print(traceback.format_stack() )\n'] test Sub1 passed sub2 passed sub3 passed |
ちょっと分かりにくいですね。
視覚的に分かりやすくするためにも、リストをくっつけるjoin関数を使って出力させることをおすすめします。
終わりに
今回はPythonでExceptionが発生しない状態でもStackTraceを表示させる方法についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません