例外がスローされた Python 関数のローカル変数を取得できますか? 質問する

例外がスローされた Python 関数のローカル変数を取得できますか? 質問する

プロジェクト用にカスタム ログ システムを作成しています。関数が例外をスローした場合、そのローカル変数をログに記録したいと考えています。例外をキャッチした except ブロックから、例外を発生させた関数のローカル変数にアクセスすることは可能ですか? たとえば、次のようになります。

def myfunction():
    v1 = get_a_value()
    raise Exception()

try:
    myfunction()
except:
    # can I access v1 from here?

ベストアンサー1

例外処理コードで必要になることがわかっている場合は、例外に値を渡す方が一般的にはすっきりした設計になります。ただし、デバッガなど、事前にどの変数であるかを知らずにアクセスする必要があるようなプログラムを作成する場合は、できる例外がスローされたコンテキスト内の任意の変数にアクセスします。

def myfunction():
    v1 = get_a_value()
    raise Exception()

try:
    myfunction()
except:
    # can I access v1 from here?
    v1 = inspect.trace()[-1][0].f_locals['v1']

関数の機能traceとそれが扱うオブジェクトの形式tracebackについては、inspectモジュールドキュメント

おすすめ記事