🐍 「動くコード」から「落ちないコード」へ
プログラムを書いていて、ある日突然エラーで止まる——プログラミングを学ぶ誰もが通る道です。😱
でも、プロのコードは「エラーが起きないコード」ではなく、「エラーが起きても落ちないコード」です。その違いを生み出すのが、Pythonの例外処理。これが書けるようになると、あなたのコードは一気に「プロダクトレベル」の風格を帯びてきます。✨
📘 そもそも「例外」とは?
プログラミングにおける例外(exception)とは、コンピューターが命令を実行したときに発生する「問題」のこと。
例外が発生する典型パターン
- 📌 0で割る計算:
10 / 0は数学的にあり得ないのでZeroDivisionErrorが発生 - 📌 未定義の変数:定義していない変数にアクセスすると
NameErrorが発生 - 📌 ネットワーク障害:通信が途切れて外部APIから応答が来ない
- 📌 メモリ不足:コンピューターの空きメモリが枯渇
- 📌 ファイルがない:開こうとしたファイルが存在しない(FileNotFoundError)
ソースコードのミスで起きる例外もあれば、コードの問題ではなく外部要因で起きる例外もあります。後者は予測しづらいからこそ、「あらかじめ対処しておく」姿勢が重要なのです。🛡️
🎯 Pythonの例外処理:try-exceptの基本構文
Pythonで例外処理を書くには try と except を使います。
try:
# 例外が発生する可能性のある処理
result = x / y
except ZeroDivisionError:
# 例外が発生したときの処理
print("0では割れません")
tryブロック
try: の後にインデントをつけて、例外が発生する可能性のある処理を書きます。「ここで何か起きるかもしれない」という宣言です。
exceptブロック
except 例外型: の後に、例外が発生したときに実行する処理を書きます。これで、例外が起きてもプログラムは止まらず、優雅に対処できます。👍
📋 代表的な例外クラスと使い分け
Pythonには例外の種類ごとに専用の例外クラスがたくさん用意されています。代表的なものを押さえておきましょう。
- 📌
ZeroDivisionError:0で割ったとき - 📌
NameError:未定義の変数を使ったとき - 📌
TypeError:型が合わない演算をしたとき(例:文字列+数値) - 📌
ValueError:値が不正なとき(例:int("abc")) - 📌
FileNotFoundError:ファイルが見つからないとき - 📌
MemoryError:メモリ不足のとき - 📌
AttributeError:オブジェクトに存在しない属性にアクセスしたとき
例外オブジェクトの中身を取り出す
as 変数名 をつけると、例外オブジェクトを変数に代入して内容を確認できます。
try:
result = 10 / 0
except ZeroDivisionError as e:
print(e) # division by zero
Pythonが内部的に出力するエラーメッセージの詳細説明を、自分のコードで取り出して使えるようになります。🔍
🔀 複数のexceptを書いて、例外ごとに対応を分ける
except ブロックはいくつでも書くことができ、例外の種類ごとに異なる処理を実行できます。
try:
result = x / y
except ZeroDivisionError as e:
print("0では割れません")
print(e)
except NameError as e:
print("変数が定義されていません")
print(e)
「0除算ならこの処理」「未定義変数ならこの処理」と、状況に応じて柔軟に対処できます。プロのコードでは当たり前に使われるパターンです。🎯
✨ try-except-else-finally:4つのブロックの役割
例外処理を完全にコントロールするには、4つのブロックの使い分けを覚えましょう。
try:例外が発生する可能性のある処理
「ここでエラーが起きるかも」という処理を書く場所。
except:例外が発生したときの処理
例外が起きたときの「リカバリー」処理。
else:例外が発生しなかったときの処理
「tryが成功した場合のみ」実行したい処理を書きます。
try:
result = 10 / 2
except ZeroDivisionError:
print("0では割れません")
else:
print("正常に終了しました")
print(f"結果は {result}")
finally:例外の有無にかかわらず必ず実行される処理
例外が起きても起きなくても必ず最後に実行される処理を書きます。リソースの解放や、ログ出力などに使うのが定番です。
try:
result = 10 / 0
except ZeroDivisionError:
print("0では割れません")
else:
print("正常終了")
finally:
print("処理が完了しました") # 例外の有無に関係なく必ず実行
4つのブロックの実行順序は try → except(または else)→ finally。tryで例外が出れば except 経由、出なければ else 経由を通り、どちらの場合も finally は必ず通るのがポイントです。📝
🛡️ Exception:すべての例外をキャッチする最終手段
個別の例外クラスではなく、Exception を指定するとシステム終了以外のすべての例外をキャッチできます。
try:
# 何らかの処理
result = x / y
except Exception as e:
print(f"何らかのエラーが発生しました: {e}")
Exceptionクラスの位置づけ
Pythonがあらかじめ定義している例外クラスは、システム終了系(SystemExit など)を除いて、すべてが Exception クラスから派生しています。だから except Exception と書けば、ほぼあらゆる例外をキャッチできるわけです。🏛️
ただし「とりあえず全部キャッチ」はバグを隠す原因にもなります。特定の例外を個別にキャッチして、想定外のものだけ最後に Exception で受けるのが、保守性の高い書き方です。⚠️
💡 実務で例外処理が活躍する場面
実際のシステムで例外処理が必要になるのは、外部とのデータのやり取りがある部分が中心です。
- 📁 ファイル操作:読み込み・書き込み時のエラー
- 🗄️ データベース接続:接続失敗、クエリエラー
- 🌐 HTTP通信:タイムアウト、サーバーエラー
- 📊 データ変換:不正な値の型変換失敗
- 🔐 認証処理:トークン期限切れ、権限エラー
こうした場面で例外処理を適切に書けていると、「想定外の事態でも止まらないアプリケーション」が作れるようになります。これがプロのコードと初心者コードを分ける、もっとも分かりやすい差です。🚀
📚 Pythonの「例外処理力」を磨く厳選書籍&ツール
例外処理は、Pythonを使い続ける限り何度も書く必須スキル。良書を手元に置いて、引き出しを増やしていきましょう。
🌱 まずは基礎から:『スッキリわかるPython入門』
例外処理を含めたPythonの基本文法を体系的に学べる定番書。初学者の「なぜ」に丁寧に答えてくれます。
📖 実務で使いこなす:『Python実践入門』
例外処理の応用テクニックや、Pythonらしい書き方を深く学べる1冊。中級者へのステップアップに最適です。
🚀 「良いコード」への90の指針:『Effective Python 第2版』
例外処理の書き方やキャッチすべき範囲など、Pythonコミュニティの推奨スタイルが詰まった必読書。
🛡️ 落ちないコードを書く:『ロバストPython』
例外処理を含む、堅牢で保守しやすいPythonコードの書き方を学べる実践書。「業務で使えるコード」を書きたい人に最適です。
⌨️ デバッグを支える相棒キーボード
例外処理を書いたりエラーを追ったりする時間は地味にタイピングが多い作業。打鍵感が良く複数デバイス切替対応のキーボードがあれば、集中力が長く続きます。
❓ よくある質問(FAQ)
🤔 Q1. 例外処理は何でもかんでも書くべき?
いいえ、書きすぎは逆効果です。「失敗する可能性が高く、リカバリーが必要な処理」に絞って書くのがコツ。try-except で囲みすぎると、本来発見すべきバグが隠れてしまう「例外の握りつぶし」が起きます。🤐
🤔 Q2. except Exception だけで全部キャッチしてもいい?
避けるべきです。個別の例外を明示的にキャッチするのが推奨される書き方。Exception は「想定外のものを最後に拾う安全網」として使うのがプロの作法です。🛡️
🤔 Q3. raise文って何?
例外を意図的に発生させる命令です。例:raise ValueError("値が不正です")。入力チェックなどで「ここで処理を止めて呼び出し元にエラーを伝えたい」場面で使います。⚠️
🤔 Q4. カスタム例外って作れる?
はい、作れます。class MyAppError(Exception): pass のように Exception を継承したクラスを定義すれば、アプリ独自の例外を表現できます。大規模開発では必須のテクニックです。🎨
🤔 Q5. finally と with、どっち使えばいい?
ファイル操作などのリソース解放には with 文を使うのが現代Pythonの推奨スタイル。finally よりも簡潔で、閉じ忘れがありません。例:with open("file.txt") as f: ...。✨
🎯 まとめ:例外処理で「落ちないコード」へ
Pythonの例外処理をおさらいすると——
- 📌 try:例外が発生する可能性のある処理
- 📌 except:例外発生時の処理(複数書ける)
- 📌 else:例外が発生しなかったときの処理
- 📌 finally:例外の有無に関わらず必ず実行される処理
- 📌 as 変数名:例外オブジェクトを取り出して詳細を確認
- 📌 Exception:システム終了以外の全例外をキャッチする最終手段
例外処理を書けるようになると、コードは見違えるほど頑丈になります。ファイルが見つからなくても、ネットワークが切れても、不正な入力が来ても——あなたのプログラムは優雅に対処して、ユーザーに分かりやすいメッセージを返せるようになります。💪
「動くコード」から「落ちないコード」へ。プロのプログラマーへの第一歩は、例外処理を当たり前に書く習慣から始まります。今日のコーディングから、ぜひ try-except を意識して書いてみてください。あなたのプログラムが、見違えるほど信頼できる存在に変わっていきます。🚀









































コメント