[Pythonのはじめ方] Part16: 例外処理(try, except, finally)

Python

はじめに:例外処理ってなに?🤔

プログラムを書いていると、予期せぬエラーが発生することがあります。例えば、「0で割り算をしてしまった」「存在しないファイルを開こうとした」などです。これらのエラーは「例外 (Exception)」と呼ばれます。

例外が発生すると、通常、プログラムはその場で停止してしまいます。しかし、例外処理を適切に行うことで、プログラムが突然終了するのを防いだり、エラー発生時に特定の処理(例えばエラーメッセージを表示するなど)を実行させたりできます。プログラムをより頑丈(ロバスト)にするための重要な仕組みです。

基本的な使い方:try と except 🛠️

Pythonの例外処理の基本は tryexcept ブロックを使います。

  • try ブロック:この中に、例外が発生する可能性のあるコードを書きます。
  • except ブロック:try ブロック内で特定の例外が発生した場合に、この中のコードが実行されます。

例:ゼロ除算エラーをキャッチする

数値を0で割ろうとすると ZeroDivisionError という例外が発生します。これを try-except で捕捉してみましょう。

try:
    num = 10 / 0  # ここで ZeroDivisionError が発生する
    print("計算結果:", num) # この行は実行されない
except ZeroDivisionError:
    print("🚨 0で割ることはできません!")

print("プログラムは継続しています...")

# --- 実行結果 ---
# 🚨 0で割ることはできません!
# プログラムは継続しています...

try ブロック内で ZeroDivisionError が発生したため、except ZeroDivisionError: ブロック内のコードが実行され、エラーメッセージが表示されました。重要なのは、プログラムが途中で停止せず、最後の print 文まで実行されている点です。

複数の例外をキャッチする

複数の種類の例外を処理したい場合は、except ブロックを複数書くことができます。

my_list = [1, 2, 3]
index_str = "a" # わざと文字列にする

try:
    index = int(index_str) # ここで ValueError が発生する可能性
    print("リストの要素:", my_list[index]) # ここで IndexError が発生する可能性
except ValueError:
    print("🔢 数値に変換できませんでした。")
except IndexError:
    print("🔗 リストの範囲外のインデックスです。")
except Exception as e: # その他の予期せぬエラーをキャッチ
    print(f"🤔 その他のエラーが発生しました: {e}")

# --- index_str が "a" の場合 ---
# 🔢 数値に変換できませんでした。

# --- index_str が "10" の場合 ---
# 🔗 リストの範囲外のインデックスです。

発生した例外の種類に応じて、対応する except ブロックが実行されます。最後の except Exception as e: は、それまでの except でキャッチされなかった全ての例外を捕捉します。as e と書くことで、発生した例外オブジェクト(エラーの詳細情報)を変数 e で受け取ることができます。

⚠️ 注意: except: のように例外の種類を指定しない(または except Exception: を使う)と、すべての種類のエラーを捕捉してしまいます。これは意図しないエラーまで隠蔽してしまう可能性があるため、できるだけ具体的な例外を指定することが推奨されます。

エラーがなかった場合の処理:else ブロック ✅

try ブロック内のコードが例外を発生させずに正常に完了した場合にのみ実行したい処理は、else ブロックに書くことができます。

try:
    num_str = input("数値を入力してください: ")
    num = int(num_str)
except ValueError:
    print("🚨 数値以外が入力されました。")
else:
    print(f"✅ 入力された数値は {num} です。") # 例外が発生しなかった場合のみ実行

# --- "123" と入力した場合 ---
# 数値を入力してください: 123
# ✅ 入力された数値は 123 です。

# --- "abc" と入力した場合 ---
# 数値を入力してください: abc
# 🚨 数値以外が入力されました。

else ブロックは、try ブロックの直後に、except ブロックの後に記述します。例外が発生した場合は else ブロックは実行されません。

必ず実行される処理:finally ブロック 🧹

finally ブロックは、try ブロック内で例外が発生したかどうかに関わらず、最後に必ず実行される処理を記述します。

ファイルを開いた後に必ず閉じる、ネットワーク接続を切断するなど、後片付け処理によく使われます。

f = None # 変数を初期化
try:
    f = open("my_file.txt", "w", encoding="utf-8") # ファイルを開く(書き込みモード)
    content = input("ファイルに書き込む内容: ")
    num = int(content) # わざと数値変換(エラーを起こす可能性)
    f.write(str(num))
except ValueError:
    print("🚨 数値以外は書き込めません。")
except Exception as e:
    print(f"🤔 その他のエラー: {e}")
else:
    print("✅ ファイルに書き込みました。")
finally:
    if f: # ファイルが正常に開かれていたら
        f.close() # 必ずファイルを閉じる
        print("🚪 ファイルを閉じました。")
    else:
        print("🚪 ファイルは開かれませんでした。")

# --- "123" と入力した場合 ---
# ファイルに書き込む内容: 123
# ✅ ファイルに書き込みました。
# 🚪 ファイルを閉じました。

# --- "abc" と入力した場合 ---
# ファイルに書き込む内容: abc
# 🚨 数値以外は書き込めません。
# 🚪 ファイルを閉じました。

この例では、数値変換で ValueError が発生しても、正常に書き込めても、finally ブロックは必ず実行され、ファイルが閉じられます(ファイルが開かれていれば)。

💡 Tip: ファイル操作などでは、with 文を使うと finally で明示的に close() を書かなくても自動で後片付けをしてくれるため、より簡潔で安全なコードになります。(with 文は Step 3 で学びましたね!)

まとめ 📖

今回はPythonの例外処理の基本である try, except, else, finally を学びました。

構文役割
try:例外が発生する可能性のあるコードを記述する場所。
except 例外の種類:指定した種類の例外が try ブロックで発生した場合に実行される処理。
else:try ブロックで例外が発生しなかった場合に実行される処理。
finally:例外の発生有無に関わらず、最後に必ず実行される処理(後片付けなど)。

例外処理を使いこなすことで、予期せぬエラーにも対応できる、より安定したプログラムを作成することができます。最初は少し難しく感じるかもしれませんが、実際にコードを書いて試してみるのが一番です! 💪

参考情報 🌐

コメント

タイトルとURLをコピーしました