3秒でわかる
例外が起きたときの代わりの処理を書き、プログラムを止めずに続ける構文。想定外の入力や通信の失敗を、落ちずに扱うために使います。
もう少し詳しく
どういうものか
try-except は Python の例外処理の構文です。try のブロックで例外が起きると、その時点で残りの行を飛ばし、対応する except のブロックに移ります。例外が起きなければ except は素通りされます。else を付ければ例外が起きなかったときだけ動く処理を、finally を付ければ例外の有無にかかわらず必ず動く後始末を書けます。
Java や JavaScript では同じ役割を try-catch と書きます。名前は違いますが、危険な処理を囲み、失敗したときの道を別に用意するという考え方は共通です。
なぜ必要か
ファイルが無い、数字のはずの文字列が数字でない、通信先が応答しない。こうした失敗は、書き方をどれだけ丁寧にしても消せません。何もしなければプログラムはその場で終了し、途中まで進めた作業も失われます。例外処理は、失敗したときに何をするかを先に決めておく仕組みです。
具体例
try:
with open("data.csv", encoding="utf-8") as f:
rows = f.read().splitlines()
except FileNotFoundError:
rows = []
print("ファイルが無いので空で続行")
except UnicodeDecodeError as e:
raise RuntimeError("<a href="/glossary/character-encoding" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">文字コード</a>が想定と違います") from e
else:
print(f"{len(rows)} 行を読み込みました")
finally:
print("読み込み処理を抜けます")つまずきやすいところ
いちばん多い誤りは、except の後ろに何も書かず、すべての例外をまとめて握り潰す書き方です。打ち間違えた変数名も、想定外のバグも、同じ場所で静かに消えてしまい、原因の分からない不具合になります。捕まえる例外は FileNotFoundError のように具体的に指定し、扱えないものは上に投げるのが原則です。
try で囲む範囲を広げすぎるのも読みにくさの原因になります。50 行まるごと囲むと、どの行が失敗したのか分からなくなります。失敗しうる行だけを囲んでください。
例外を握り潰した後に何もしないと、後続の行が壊れた値のまま進みます。上の例のように、代わりの値を必ず用意しておく必要があります。
覚え方
try が「やってみる」、except が「駄目だったときの道」、finally が「どちらでも通る出口」です。この 3 つを日本語に置き換えて読むと、どの節に何を書くべきかが判断しやすくなります。else は使う機会が少ないものの、成功したときだけの処理を分離できます。