Pythonの例外処理とは?try・except・finallyの使い方を解説

PR Python

Pythonの例外処理とは?try・except・finallyの使い方を解説

💡 この記事でわかること

  • 例外(エラー)とは何か、なぜプログラムが止まるのか
  • try・except でエラーをキャッチして処理を続ける方法
  • ValueError などエラーの種類を指定してキャッチする方法
  • else・finally の役割、raise でわざと例外を出す方法
  • 初心者がよく出会うエラーの一覧

1. 例外(エラー)とは?

例外とは、
👉 プログラムの実行中に発生する「想定外の事態」のことです。エラーと呼ばれることも多いです。

例えば、次のコードは「数字」を期待していますが、利用者がabcと入力すると例外が発生します。

num = int(input("数字を入力: "))
print(num * 2)

# 「abc」と入力すると…
# ValueError: invalid literal for int() with base 10: 'abc'

👉 例外が発生すると、そこでプログラムは強制的に停止し、それ以降の処理は実行されません。この「停止」を防ぎ、エラーが起きても処理を続けられるようにするのが例外処理です。

👉 型変換(int()・str()など)とエラーについての記事はこちら


2. try・except の基本

tryのブロックに「エラーが起きるかもしれない処理」、exceptのブロックに「エラーが起きたときの処理」を書きます。

try:
    num = int(input("数字を入力: "))
    print(f"2倍すると {num * 2} です")
except ValueError:
    print("数字を入力してください")

print("プログラムは続行します")
  • tryの中でエラーが起きなければ、exceptはスキップされる
  • tryの中でエラーが起きると、その時点でexceptに移る(tryの残りは実行されない)
  • exceptで処理したあとは、プログラムは止まらずに先に進む

3. エラーの種類を指定する

except ValueError:のように書くと、その種類のエラーだけをキャッチします。想定していない別のエラーは、そのまま止まってくれるので原因に気づけます。

try:
    result = 10 / 0
except ZeroDivisionError:
    print("0で割ることはできません")

複数の種類を分けて処理する

try:
    a = int(input("割られる数: "))
    b = int(input("割る数: "))
    print(a / b)
except ValueError:
    print("数字を入力してください")
except ZeroDivisionError:
    print("0では割れません")

エラーメッセージを受け取る(as e)

try:
    value = int("abc")
except ValueError as e:
    print("エラー内容:", e)
    # エラー内容: invalid literal for int() with base 10: 'abc'

💡 as eと書くと、エラーの詳細情報を変数eで受け取れます。ログに残したり、原因を表示したりするときに使います。


4. else と finally

tryには、elsefinallyを追加できます。

  • else:tryで例外が起きなかったときだけ実行される
  • finally:例外の有無にかかわらず必ず実行される(後片付け用)
try:
    num = int("10")
except ValueError:
    print("変換に失敗しました")
else:
    print("変換に成功:", num)   # 例外がなかったときだけ
finally:
    print("処理を終了します")     # 必ず実行される

5. raise でわざと例外を出す

raiseを使うと、自分で例外を発生させることができます。関数に渡された値がおかしいときなど、「これは想定外だ」と明示的に知らせたい場面で使います。

def set_age(age):
    if age < 0:
        raise ValueError("年齢は0以上で指定してください")
    return age

print(set_age(20))    # 20
print(set_age(-5))    # ValueError: 年齢は0以上で指定してください

👉 Pythonの関数(def・引数・戻り値)についての記事はこちら


6. 例外処理を使うときの注意

👉 「エラーを消すため」だけに例外処理を使うのは避けましょう。次のように種類を指定せず何でもキャッチしてpassすると、本来直すべきバグまで隠れてしまい、原因がまったく分からなくなります。

# 悪い例:すべての例外を握りつぶしている
try:
    do_something()
except:
    pass
  • キャッチするエラーは具体的な種類を指定する(except ValueError:など)
  • 例外処理は「起こりうると分かっていて、対処法があるエラー」に対して使う
  • 原因不明のエラーは、むしろ止まってくれたほうが気づける

7. よく出会うエラー一覧

エラー名起きる状況
ValueErrorint("abc") など、型は合うが値が不正
TypeError"文字" + 5 など、型に合わない操作
ZeroDivisionError0 で割り算をした
IndexErrorリストの範囲外の番号を指定した
KeyError辞書に存在しないキーを指定した
NameError定義していない変数を使った
FileNotFoundError存在しないファイルを開こうとした

💡 エラーメッセージは最後の行が最も重要です。「どのエラーが、どのファイルの何行目で起きたか」が書かれているので、まずはそこを落ち着いて読みましょう。


8. まとめ

  • 例外が起きるとプログラムは停止する。try・exceptで止まらずに対処できる
  • キャッチするエラーは種類を具体的に指定する(except ValueError:)
  • as eでエラーの詳細を受け取れる
  • else=例外がなかったとき、finally=必ず実行
  • raiseで自分から例外を出せる。何でも握りつぶすexcept: passは避ける

👉 まずはint(input())try・except ValueErrorで囲むところから使ってみましょう。ユーザーの入力を扱うプログラムでは、ほぼ必ず登場するパターンです。

-Python
-, , , ,