例外が握りつぶされる事件が発生したので備忘録として残しておきます。。ドキュメント軽くさらった感じだと書いてなかった...?1
10/23 追記
@links_2_3_4 さんから情報をいただきました。下記ページに記載があります。
8. 複合文 (compound statement) — Python 3.7.1 ドキュメント
finally 節で return 文あるいは break 文を実行した場合は、保存された例外は破棄されます
以下のような書き方をすると例外が握り潰されます。
python3
def hoge():
try:
raise Exception("例外発生")
except Exception as e:
print("hoge内で例外発生")
raise e
finally:
# 処理
return "返り値"
def fuga():
try:
res = hoge()
except Exception as e:
print(f"fugaで例外検知: {str(e)}")
if __name__=="__main__":
fuga()
実行結果
hoge内で例外発生
本来は単に外に書くか、else
節内に書くべきだったのですよね。。なんか自分血迷ってたみたいです2。
python3
def hoge():
try:
raise Exception("例外発生")
except Exception as e:
print("hoge内で例外発生")
raise e
finally:
# 処理
pass
return "返り値"
def fuga():
try:
res = hoge()
except Exception as e:
print(f"fugaで例外検知: {str(e)}")
if __name__=="__main__":
fuga()
実行結果
hoge内で例外発生
fugaで例外検知: 例外発生
「例外が無視されてる?!?」と思ったら今一度return
の位置を確認するといいのかもしれません。
それにしてもこれは気づかないよなぁ...暗黙に握りつぶすぐらいなら文法エラーにしてほしいと個人的には思いました()
読んでいただきありがとうございます。いろいろご指摘くださると幸いです。m(_ _)m