エラーと例外の要点
内容の確認日: 2026-10-04
この分野は「Pythonチュートリアル」の第 8 章 (エラーと例外) に対応します。例外が起きたときに、try 文のどの節がどの順番で実行されるかを追う問題が中心です。
特に、else 節が実行される条件と、finally 節が return よりも先に実行される点は、よく問われます。
構文エラーと例外
Python のエラーには 2 種類あります。
・構文エラー (SyntaxError): コロンの書き忘れやインデントの誤りなど、文法の誤り。プログラムを実行する前に見つかるので、ファイルの中のどのコードも実行されない
・例外: 文法は正しいが、実行中に起きるエラー。ZeroDivisionError (0 で割った)・NameError (未定義の名前)・TypeError (型が合わない)・ValueError (値が不正)・KeyError・IndexError など
print("ここは実行されない")if True print("x")python3 main.py
例外が発生: SyntaxError
1 行目の print は正しいコードですが、4 行目の if にコロンがないため、ファイル全体が実行されません。例外は処理しないとプログラムが止まり、トレースバック (例外が起きた場所と種類) が表示されます。
try 文の流れ
例外は try 文で処理します。各節が実行される条件は次のとおりです。
・try 節: まず実行される。例外が起きたら、残りの処理を飛ばして except 節を探す
・except 節: 起きた例外の型に合うものが上から順に 1 つだけ実行される
・else 節: try 節で例外が起きなかったときだけ実行される
・finally 節: 例外の有無にかかわらず、必ず最後に実行される
def parse(text): try: value = int(text) except ValueError: print(text, "→ 数値ではない") else: print(text, "→", value) finally: print("後始末")parse("12")parse("x")python3 main.py 12 → 12 後始末 x → 数値ではない 後始末
finally 節は、try 節の中で return した場合も、関数を抜ける前に実行されます。
def f(): try: return "try の戻り値" finally: print("finally")print(f())python3 main.py finally try の戻り値
複数の例外の捕捉
複数の例外を 1 つの except でまとめて捕捉するには、except (KeyError, IndexError): のようにタプルで並べます。except ValueError as e: と書くと、例外のオブジェクトを変数 e で受け取れます。
例外にはクラスの階層があり、except Exception: はほとんどの例外 (Exception のサブクラス) を捕捉します。except は上から順に調べられるので、範囲の広い例外を先に書くと、後ろの except は実行されません。型を書かない except: はすべての例外を捕捉しますが、予期しない誤りまで隠してしまうので、使うときは注意が必要です。
処理されなかった例外は、呼び出し元へ伝わっていきます。内側の try に合う except がなければ、外側の try の except で捕捉されます。
raise と独自の例外
raise 文で、例外を自分で発生させられます。except 節の中で引数なしの raise を書くと、捕捉した例外をそのまま投げ直します。
独自の例外は、Exception (またはそのサブクラス) を継承したクラスとして作ります。基底の例外クラスを作り、個別の例外をそのサブクラスにしておくと、except 基底クラス: でまとめて捕捉できます。
class AppError(Exception): passclass InputError(AppError): def __init__(self, field): super().__init__(f"{field} が不正です") self.field = fieldtry: raise InputError("age")except AppError as e: print(type(e).__name__, e, e.field)try: [1, 2][5]except (KeyError, IndexError) as e: print("捕捉:", type(e).__name__)raise ValueError("最後は捕捉しない")python3 main.py InputError age が不正です age 捕捉: IndexError
例外が発生: ValueError
InputError は AppError のサブクラスなので、except AppError で捕捉されます。最後の ValueError はどこでも捕捉されないので、トレースバックを表示してプログラムが止まります。
後始末と with 文
ファイルなどの後始末は finally 節に書けますが、with 文を使うと、ブロックを抜けるときに (例外が起きても) 自動で後始末が行われます。with open(...) as f: でファイルが自動で閉じられるのは、この仕組みによるものです。
試験でよくある引っかけ
構文エラーのあるファイル
構文エラーがあると、エラーの行より前のコードも含めて、ファイル全体が実行されません。
else節の実行条件else節はtry節で例外が起きなかったときだけ実行されます。例外が起きてexceptで処理した場合は実行されません。finallyとreturntry節でreturnしても、関数を抜ける前にfinally節が実行されます。複数の例外のまとめ方
except (KeyError, IndexError):のようにタプルで書きます。exceptの順番上から順に調べ、最初に合った 1 つだけを実行します。
except Exception:を先に書くと、後ろのexceptには届きません。独自の例外の基底クラス
独自の例外は
Exceptionを継承して作ります。
問題で確認する
この分野の問題を、解説つきで読めます (登録不要)。
出典・参考
- Python エンジニア育成推進協会「Python 3 エンジニア認定基礎試験」
- Python ドキュメント「Python チュートリアル」8. エラーと例外
- Python ドキュメント「組み込み例外」 (例外クラスの階層)
コード例は、実際に実行して結果を確認しています。