🔖

【Python】 try-except-else-finally について整理する

に公開

はじめに

Python には try-except だけでなく、
elsefinally を組み合わせられる例外処理の書き方 があります。

「使い方をよく知らないまま書いていた」という方にも役立つように整理します。

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 が実行される

💡elsefinally の違い

ブロック 実行される条件 主な用途
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