💬 くるるちゃんのワンポイント図解解説
【技術背景・解説】
この記事(Python初心者向け:try-exceptで学ぶ例外処理の基本)におけるIT技術の基本概念と重要ポイントを、わかりやすく整理・解説しています。
【アイキャッチ図解のポイント】
構成要素とデータフローを視覚的に整理し、初心者でも要点を掴みやすいグラフィック構造で表示しています。
【資格・要点ノート】
シラバス用語、基本概念の理解、実務への応用ポイント
はじめに
Pythonでプログラムを実行していると、ファイルが見つからない、数値に変換できない入力が来た、ネットワーク接続が切れたなど、想定外のエラーが起きてプログラム全体が停止してしまうことがあります。そんなときに使うのが例外処理(Exception Handling)です。
例外処理を使えば、エラーが発生しても適切に対処し、プログラムの実行を継続させることができます。この記事では、Pythonのtry-except構文を中心に、初心者が最低限押さえておくべき例外処理の基本を実践的なコード例とともに解説します。
例外(Exception)とは
Pythonにおける例外とは、プログラム実行中に発生するエラーのことです。例外が発生すると、通常はそこでプログラムが停止し、トレースバック(エラーメッセージ)が表示されます。
よく遭遇する例外には以下のようなものがあります:
| 例外名 | 発生する場面 | 具体例 |
|---|---|---|
ValueError | 不正な値が渡されたとき | int("abc") |
TypeError | 型が合わないとき | "text" + 123 |
ZeroDivisionError | ゼロ除算 | 10 / 0 |
FileNotFoundError | ファイルが存在しない | open("存在しない.txt") |
KeyError | 辞書に存在しないキー | d = {}; d["key"] |
IndexError | リストの範囲外アクセス | lst = [1]; lst[5] |
try-except構文の基本
tryブロックにエラーが起こりうるコードを書き、exceptブロックでそのエラーを捕まえて処理します。これにより、エラーが発生してもプログラムを止めずに実行を続けられます。
try:
result = 10 / 0
except ZeroDivisionError:
print("0で割ることはできません")
print("プログラムは続行されます")
# 出力:
# 0で割ることはできません
# プログラムは続行されます
もしtry-exceptを使わなければ、ZeroDivisionErrorが発生した時点でプログラムが停止し、以降のコードは実行されません。
ユーザー入力を安全に扱う
例外処理が最も活躍する場面の一つが、ユーザーからの入力処理です。
try:
num = int(input("数字を入力してください:"))
except ValueError:
print("数値ではありません")
else:
print(f"入力された数字は {num} です")
finally:
print("入力処理が完了しました")
各ブロックの役割
try— エラーが発生する可能性のあるコードを記述except— 指定した例外が発生したときの処理else— 例外が発生しなかったときだけ実行される処理finally— 例外の有無にかかわらず必ず実行される処理(リソース解放など)
複数の例外をまとめて処理する
1つのtryブロックで複数の種類のエラーに対応することもできます。
# 方法1: 複数の except ブロック
try:
data = {"price": "abc"}
value = int(data["price"])
except KeyError:
print("キーが見つかりません")
except ValueError:
print("数値に変換できません")
# 方法2: タプルでまとめる
try:
value = int(data["price"])
except (KeyError, ValueError) as e:
print(f"エラーが発生: {e}")
実践例:ファイル読み込み
ファイル操作は例外処理の典型的なユースケースです。ファイルが存在しない、権限がない、エンコーディングが違うなど、さまざまなエラーが起こり得ます。
def read_config(filepath):
try:
with open(filepath, "r", encoding="utf-8") as f:
return f.read()
except FileNotFoundError:
print(f"設定ファイルが見つかりません: {filepath}")
return None
except PermissionError:
print(f"ファイルへのアクセス権限がありません: {filepath}")
return None
except UnicodeDecodeError:
print(f"ファイルのエンコーディングが不正です: {filepath}")
return None
config = read_config("settings.json")
if config:
print("設定を読み込みました")
実践例:API通信のエラーハンドリング
外部APIとの通信では、ネットワーク障害やタイムアウトなど予測不能なエラーが発生します。
import requests
def fetch_weather(city):
try:
response = requests.get(
f"https://api.example.com/weather/{city}",
timeout=5
)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
print("リクエストがタイムアウトしました")
except requests.exceptions.ConnectionError:
print("サーバーに接続できませんでした")
except requests.exceptions.HTTPError as e:
print(f"HTTPエラー: {e.response.status_code}")
return None
やってはいけないアンチパターン
例外処理にはいくつかの「やってはいけない」パターンがあります。初心者がよくやりがちなミスを紹介します。
1. 何でも捕まえる裸の except
# 悪い例: すべての例外を握りつぶす
try:
do_something()
except:
pass # エラーを無視してしまう
# 良い例: 具体的な例外を指定する
try:
do_something()
except ValueError as e:
print(f"値が不正です: {e}")
裸のexceptやexcept Exceptionでエラーを無視すると、バグの原因がわからなくなります。必ず具体的な例外クラスを指定しましょう。
2. 例外を使ったフロー制御
# 悪い例: 例外で分岐処理
try:
value = my_dict[key]
except KeyError:
value = default_value
# 良い例: 事前チェックや get() を使う
value = my_dict.get(key, default_value)
例外処理は本来「例外的な状況」への対応です。通常のフロー制御にはif文や安全なメソッドを使いましょう。
例外処理のベストプラクティス
- 具体的な例外を捕まえる —
except Exceptionではなく、except ValueErrorのように具体的に - エラーメッセージを記録する —
as eでエラー内容を取得し、ログに残す - finally でリソースを解放する — ファイルやDB接続は確実に閉じる
- 必要な範囲だけ try で囲む — try ブロックは最小限にし、どこでエラーが起きたかわかるようにする
- with文を活用する — ファイルやDB接続にはコンテキストマネージャを使えば、finally不要で安全に扱える
まとめ
Pythonの例外処理は、エラーに強い安定したプログラムを書くための基本スキルです。ポイントをおさらいします:
try-exceptでエラーを安全に捕まえ、プログラムの停止を防ぐelseは正常時のみ、finallyは必ず実行される後処理に使う- 複数の例外は個別の
exceptかタプルで対応 - 裸の
exceptやエラーの握りつぶしは絶対に避ける - ファイル操作やAPI通信など、外部リソースとのやり取りでは特に重要
例外処理をマスターすれば、ユーザー入力・ファイル操作・API通信など、あらゆる場面でエラーに強いコードが書けるようになります。まずは今回のサンプルコードを手元で動かして、例外の挙動を体感してみてください。
コメント(0件)
まだコメントはありません。最初のコメントを投稿してください!