モブプロな人たちのブログ

横浜で Web サービス開発しているエンジニアの日記です。Python 大好き Flask 大好き。たまに SpriteKit でゲーム開発も。

Python で try/except/else/finally の各ブロックを活用する

「Effective Python」を久しぶりに読み返して、当時は特に何も思わなかった箇所に引っかかったのでメモを残しておきますシリーズ第4弾。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

Python で try/except/else/finally の各ブロックを活用する

tryexcept は良く使いますし、finally も使いますが、else をあまり使ったことがないことに気付きました。

else を使うことのメリットは、

どの例外がココのコードで扱われていて、どの例外が上に伝わっていくかを明確にできること

です。

import json

def load_json_key(data, key):
    try:
        result_dict = json.loads(data) # ValueError の可能性
    except ValueError as e:
        print('ValueError!!')
        raise
    else:
        return result_dict[key] # KeyError の可能性

if __name__ == '__main__':
    result_value = load_json_key('{"A": 10, "B": 20}', 'C')
    print(result_value)

上記の例でいうと、

  • json.loads(data) の部分で発生する可能性のある ValueError については、ココのコードで扱うというのが明確になる
  • result_dict[key] の部分で発生する可能性のある KeyError については、ココでは特に何もせず上に伝えるというのが明確になる

ということです。若干、例が分かり難いような気もしますが・・・。

今後は、積極的に try/except/else/finally の各ブロックを活用していきたいと思います。