💡 この記事でわかること
- 例外(エラー)とは何か、なぜプログラムが止まるのか
- 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には、elseとfinallyを追加できます。
- 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. よく出会うエラー一覧
| エラー名 | 起きる状況 |
|---|---|
| ValueError | int("abc") など、型は合うが値が不正 |
| TypeError | "文字" + 5 など、型に合わない操作 |
| ZeroDivisionError | 0 で割り算をした |
| IndexError | リストの範囲外の番号を指定した |
| KeyError | 辞書に存在しないキーを指定した |
| NameError | 定義していない変数を使った |
| FileNotFoundError | 存在しないファイルを開こうとした |
💡 エラーメッセージは最後の行が最も重要です。「どのエラーが、どのファイルの何行目で起きたか」が書かれているので、まずはそこを落ち着いて読みましょう。
8. まとめ
- 例外が起きるとプログラムは停止する。try・exceptで止まらずに対処できる
- キャッチするエラーは種類を具体的に指定する(
except ValueError:) as eでエラーの詳細を受け取れる- else=例外がなかったとき、finally=必ず実行
- raiseで自分から例外を出せる。何でも握りつぶす
except: passは避ける
👉 まずはint(input())をtry・except ValueErrorで囲むところから使ってみましょう。ユーザーの入力を扱うプログラムでは、ほぼ必ず登場するパターンです。