記事一覧へ戻る 本の順番で続きを読む

例外処理 - エラーを正しくハンドリングする

Python3初級 | 2026/02/18 15:36

例外処理

例外とは

プログラム実行中に発生するエラーのことです。例外処理を書かないとプログラムが異常終了します。

# 例外が発生する例
# print(10 / 0)         # ZeroDivisionError
# int("abc")            # ValueError
# my_list = [1, 2, 3]
# print(my_list[10])    # IndexError

try-except文

try:
    num = int(input("数値を入力: "))
    result = 100 / num
    print(f"結果: {result}")
except ValueError:
    print("数値を入力してください")
except ZeroDivisionError:
    print("0で割ることはできません")

複数の例外をまとめてキャッチ

try:
    result = some_function()
except (ValueError, TypeError, KeyError) as e:
    print(f"エラーが発生しました: {e}")

else と finally

try:
    f = open("data.txt", "r")
    content = f.read()
except FileNotFoundError:
    print("ファイルが見つかりません")
else:
    # 例外が発生しなかった場合に実行
    print(f"読み込み成功: {len(content)}文字")
finally:
    # 例外の有無に関わらず必ず実行
    print("処理完了")

主要な組み込み例外

例外 説明
ValueError 不正な値
TypeError 不正な型
KeyError 辞書のキーが存在しない
IndexError リストのインデックスが範囲外
FileNotFoundError ファイルが見つからない
ZeroDivisionError 0で割った
AttributeError 存在しない属性
ImportError インポートに失敗
NameError 定義されていない変数

raise文(例外を発生させる)

def set_age(age):
    if not isinstance(age, int):
        raise TypeError("年齢は整数で指定してください")
    if age < 0 or age > 150:
        raise ValueError("年齢は0から150の間で指定してください")
    return age

try:
    set_age(-5)
except ValueError as e:
    print(e)  # 年齢は0から150の間で指定してください

カスタム例外

class InsufficientFundsError(Exception):
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(
            f"残高不足: 残高{balance}円に対して{amount}円の引き出し"
        )

class BankAccount:
    def __init__(self, balance=0):
        self.balance = balance

    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientFundsError(self.balance, amount)
        self.balance -= amount
        return self.balance

account = BankAccount(1000)
try:
    account.withdraw(1500)
except InsufficientFundsError as e:
    print(e)  # 残高不足: 残高1000円に対して1500円の引き出し

まとめ

  • try/except で例外をキャッチして安全に処理
  • 特定の例外クラスを指定してキャッチする
  • else は例外なしの場合、finally は必ず実行
  • raise で例外を発生させる
  • カスタム例外は Exception を継承して作る