Pythonでプログラムを書き始めていると、必ずと言っていいほど直面するのが「エラー」です。せっかく書いたコードを実行したのに、真っ赤な文字でエラーメッセージが表示されて、そこでプログラムがガクンと止まってしまった経験はありませんか?
実は、プログラミングの世界では、実行中に予期しないエラーが発生することは日常茶飯事です。「ユーザーが数字を入れるべき場所に文字を入れてしまった」「読み込もうとしたファイルが実は存在しなかった」など、コードを書く時点では想定しきれない問題が現実には起こりえます。
こうしたエラーに対処し、プログラムを途中で強制終了させずに安全に処理を継続させるための仕組みが「例外処理」です。Pythonでは主に `try-except` 文を使ってこれを実現します。
今回は、Pythonの例外処理の基本的な書き方から、より高度な制御を行うための `else` や `finally` の使い方まで、初心者の方向けに丁寧に解説していきます。
例外処理(try-except)の基本構造
例外処理の目的は、「エラーを完全になくすこと」ではなく、「エラーが出たときにどう動くかを制御すること」にあります。
日常生活で例えるなら、料理中に材料が切れたとき、そのまま料理を諦めて止まってしまうのではなく、「別の材料で代用する」とか「すぐに買い物に行く」といった代替案を実行して、最終的に料理を完成させることに似ています。
Pythonにおける最もシンプルな例外処理の構文は以下の通りです。
基本的な書き方
“`python try: # エラーが発生する可能性のあるコードをここに書く result = 10 / 0 # 例えばゼロ除算などはエラーになります except ZeroDivisionError: # エラーが発生したときに実行したい処理をここに書く print("ゼロで除算することはできません。") “`
このコードの動きを詳しく見てみましょう。
- `try` ブロック: まず、Pythonは `try` の下に書かれた処理を実行しようとします。ここでは「エラーが起きるかもしれない処理」を囲います。
- エラーの発生: もし `try` ブロック内でエラー(例外)が発生すると、その時点で `try` ブロック内のそれ以降の処理はスキップされます。
- `except` ブロック: 発生したエラーが `except` で指定した種類(この場合は `ZeroDivisionError`)と一致すれば、`except` ブロックの中身が実行されます。
このように、`try-except` を使うことで、本来ならプログラムを停止させてしまうような致命的なエラーが出ても、実装者が意図したエラーメッセージを表示させたり、別の処理に切り替えたりすることができるようになります。
複数の例外を効率的に処理する方法
実際の開発では、一つの処理の中で複数の異なるエラーが発生する可能性があります。例えば、「ファイルの読み込み」と「数値の計算」を同時に行う場合、「ファイルが見つからないエラー」と「ゼロ除算エラー」の両方を想定しなければなりません。
Pythonでは、`except` 節を複数記述することで、エラーの種類に応じた個別の対処が可能です。
複数のexcept節を使う例
“`python try: # ファイルを開いて計算する想定の処理 with open("data.txt", "r") as f: content = f.read() number = int(content) result = 10 / number except FileNotFoundError: print("ファイルが見つかりませんでした。") except ZeroDivisionError: print("ゼロで除算することはできません。") except Exception as e: print(f"予期しないエラーが発生しました: {e}") “`
ここで注目したいのが、最後に記述している `Exception as e` です。
Exceptionクラスと例外オブジェクトの活用
Pythonには例外の「階層構造」があり、`Exception` クラスはほとんどすべての例外の親クラス(基底クラス)となっています。
- 特定の例外を指定: `FileNotFoundError` や `ZeroDivisionError` など、予想される具体的なエラーを先に書き、個別の対策を講じます。
- 汎用的な例外を最後に指定: それ以外の「想定外のエラー」をすべてキャッチしたい場合に `Exception` を使用します。
また、`except Exception as e` と記述することで、発生した例外の内容を変数 `e` に代入できます。これにより、「具体的にどのようなエラーメッセージが出たのか」を詳細に取得して出力することができ、デバッグが非常に楽になります。
例えば、存在しない変数 `y` を参照してしまった場合などは、この `Exception as e` の部分で `name 'y' is not defined` といった詳細なメッセージが表示されます。
さらに制御を細かくする else と finally
`try` と `except` だけでも十分便利ですが、Pythonにはさらに `else` と `finally` という便利なブロックが用意されています。これらを組み合わせることで、より堅牢なプログラムを作成できます。
else ブロック:正常終了したときだけ実行したい処理
`else` ブロックは、「`try` ブロック内で例外が一度も発生しなかった場合」にのみ実行されます。
“`python try: x = 10 / 2 except ZeroDivisionError: print("エラーが発生しました") else: print("計算は成功しました。結果は:", x) “`
「正常に処理が終わった後に追加で何かをしたい」場合に利用します。`try` ブロックの中にすべてを詰め込むのではなく、エラーが起きる可能性のある最小限のコードだけを `try` に書き、成功後の処理を `else` に分けることで、どこでエラーが起きる可能性があるのかが明確になり、コードの可読性が向上します。
finally ブロック:成否に関わらず必ず実行したい処理
`finally` ブロックは、例外が発生したかどうかにかかわらず、最後に必ず実行されます。
“`python try: # ファイル操作などの処理 print("処理を開始します") # ここでエラーが起きても起きなくても… except Exception as e: print(f"エラー内容: {e}") finally: print("処理が完了しました。") “`
`finally` は、主に「後始末」のために使われます。
- 開いたファイルを閉じる(クローズする)
- データベースの接続を切断する
- 使用していたメモリリソースを解放する
といった、「エラーが起きてプログラムが中断されるとしても、ここだけは絶対にやっておかないと困る」という処理を記述するのに最適です。
実践的な活用シーンと注意点
例外処理を学ぶと、「とりあえず全部 `try-except` で囲ってエラーが出ないようにすればいいのでは?」と思うかもしれません。しかし、ここには注意が必要です。
「エラーを隠す」ことの危うさ
例外処理の目的はあくまで「制御」です。エラーをただ無視したり、中身を空にした `except` 節で隠してしまったりすると、プログラムは動き続けますが、内部的に間違ったデータが処理され続け、後から原因不明の大きなバグに繋がることがあります。
これを「bare except(裸のexcept)」と呼び、特定の例外を指定せずにすべての例外をキャッチしてしまう書き方は、慎重に行うべきだとされています。
推奨される書き方のポイント
- キャッチする例外を具体的に指定する: 可能な限り `ZeroDivisionError` や `ValueError` など、想定される例外クラスを明記しましょう。
- 適切なメッセージをユーザーに返す: 内部的なシステムエラーをそのまま見せるのではなく、「入力された値が正しくありません」のように、ユーザーが次に何をすべきか分かるメッセージを出すようにします。
- リソース管理は finally または with 文で: ファイル操作などは `finally` で確実に閉じるか、Pythonの `with` 文(コンテキストマネージャ)を利用して、自動的にクローズされるように設計しましょう。
まとめ:例外処理で信頼性の高いプログラムを
Pythonの `try-except` 文は、プログラムの信頼性を高めるための強力な武器です。
- `try`: エラーが起きそうな処理を試す
- `except`: エラーが起きたときの対処法を決める
- `else`: 成功したときだけの追加処理を行う
- `finally`: どんな結果になっても必ず後始末を行う
これらを適切に使い分けることで、ユーザーが誤った操作をしても、あるいは外部環境で予期せぬトラブルがあっても、「突然止まらない、親切で安全なプログラム」を作ることができます。
まずは、自分が書いたコードの中で「ここはどうしてもエラーが起きそうだ」と思う部分に小さな `try-except` を取り入れるところから始めてみてください。エラーを恐れず、それをどう制御するかを考えることが、Python上達への近道になります。
ピックアップ記事



