python例外ハンドラの変数のスコープおかしくない?
def hoge(x): e = "out" print(f"1: {e}") try: print(100 / x) except ZeroDivisionError as e: print("error:", e) print(f"2: {e}") hoge(int(sys.argv[1]))
例外が発生しなかった場合は以下のようになる
$ python hoge.py 1 1: out 100.0 2: out
例外が発生した場合は、以下どちらかになると予想できるのだが・・・
$ python hoge.py 0 1: out error: division by zero 2: out
$ python hoge.py 0 1: out error: division by zero 2: division by zero
実際の実行結果は・・・
$ python hoge.py 0 1: out error: division by zero Traceback (most recent call last): File "/Users/nyan/hoge.py", line 16, in <module> hoge(int(sys.argv[1])) File "/Users/nyan/hoge.py", line 13, in hoge print(f"2: {e}") UnboundLocalError: local variable 'e' referenced before assignment
UnboundLocalErrorと言う例外が出た
- 例外ハンドラでローカル変数と同じ変数名を使う
- 例外が発生する
という条件でローカル変数が未初期化状態に戻されてしまうらしい・・・