11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

finally節の中にreturnを書いてはいけない

Last updated at Posted at 2018-10-22

例外が握りつぶされる事件が発生したので備忘録として残しておきます。。ドキュメント軽くさらった感じだと書いてなかった...?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

  1. 私のググラビリティは低いです。悪しからず。

  2. finallyを使用していたのはsplite3のカーソルみたいに閉じる処理が必要なものがあったからです。本当は例として挙げているコード中に含めるべきかとは思いましたが冗長かと思い省略しました。

11
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?