🔖
【Python】 try-except-else-finally について整理する
はじめに
Python には try-except だけでなく、
else や finally を組み合わせられる例外処理の書き方 があります。
「使い方をよく知らないまま書いていた」という方にも役立つように整理します。
try-except-else-finally の構造
基本形は下記の通りです。
try:
# まずここが実行される
except SomeError:
# try の中で例外が起きたらここが実行される
else:
# 例外が起きなかった場合にだけ実行される
finally:
# 成功・失敗に関わらず必ず実行される
4つのブロックには、それぞれ明確な役割があります。
各ブロックの役割と動作
try
まず実行したい処理を記載します。
try:
x = 10 / 2
except
try の中で例外が発生したときだけ実行されます。
例外の種類ごとに複数書くこともできます。
except ValueError:
print("値エラー")
except ZeroDivisionError:
print("ゼロ割りエラー")
else(成功時だけ実行)
「例外が発生しなかった場合」 にだけ実行されます。
else:
print("正常に割り算ができました:", x)
-
tryが成功 → 実行される -
tryで例外発生 → 実行されない
「後続処理は成功したときだけ実行したい」場面で便利です。
else を使う利点
else ブロックを使うと、エラーの発生源を明確にできます。
# else を使わない場合
try:
data = load_data()
process(data) # どちらで例外が起きたか区別しにくい
except FileNotFoundError:
print("ファイルがありません")
# else を使う場合
try:
data = load_data()
except FileNotFoundError:
print("ファイルがありません")
else:
process(data) # ここで例外が起きても上の except では捕捉されない
finally(必ず実行)
try が成功しても、except が走っても、
必ず実行される ブロックです。return がある場合でも、その前に実行されます。
finally:
print("処理が終了しました")
リソースのクローズ(ファイル、DB接続など)に使われます。
実行例
try:
x = 10 / 2
except ZeroDivisionError:
print("ゼロ割りエラー")
else:
print("正常に割り算ができました:", x)
finally:
print("処理が終了しました")
出力:
正常に割り算ができました: 5.0
処理が終了しました
- 例外が出ないので
elseが実行される - 最後に必ず
finallyが実行される
💡else と finally の違い
| ブロック | 実行される条件 | 主な用途 |
|---|---|---|
else |
try が成功した時だけ |
成功時の後続処理 |
finally |
成功でも失敗でも必ず | 後処理・クリーンアップ |
これを覚えておくと、設計がかなり楽になります。
よくある使いどころ
else:成功した場合だけ処理したい
try:
data = load_data()
except FileNotFoundError:
print("ファイルがありません")
else:
process(data) # 読めたときだけ実行
finally:成功・失敗に関わらず必ず実行したいとき
import time
start_time = time.time()
try:
result = calculate_something()
print(f"結果: {result}")
except Exception as e:
print(f"エラー: {e}")
finally:
elapsed = time.time() - start_time
print(f"処理時間: {elapsed:.2f}秒") # 成功でも失敗でも計測
おわりに
-
try:実行したい処理を記述 -
except:例外が発生したら実行 -
else:例外が発生しなかった場合だけ実行 -
finally:成功・失敗に関係なく必ず実行
特に else は初心者が知らないまま見過ごしがち な構文ですが、
「成功時の処理」を分離できるのでコードがきれいになります。
本記事が参考になれば幸いです。
Discussion