PythonにおけるValueErrorとTypeErrorの使い分け徹底解説

Pythonプログラミングにおいて、`ValueError` と `TypeError` は機能的に異なる例外クラスであり、適切な使用方法を理解することが重要です。

ValueError: 値の妥当性エラー

この例外は、引数のデータ型は正しくてもその値が操作可能な範囲外である場合に発生します。

典型的な発生パターン

  1. 数値変換の失敗

    int("abc123") # 非数値文字列の変換 # ValueError: invalid literal for int() with base 10: 'abc123'
  2. 無効なリスト検索

    numbers = [10, 20, 30] numbers.index(40) # 存在しない要素の検索 # ValueError: 40 is not in list
  3. 数学関数のドメインエラー

    import math math.log(-5) # 負数の対数計算 # ValueError: math domain error

カスタム関数でのValueError発生例

def calc_discount(price): if price < 0: raise ValueError("価格は0以上で指定してください") return price * 0.9

TypeError: 型不一致エラー

この例外は、オブジェクトの型が操作に不適合である場合に発生します。

典型的な発生パターン

  1. 演算子の型不一致

    "score: " + 90 # 文字列と整数の連結 # TypeError: can only concatenate str (not "int") to str
  2. メソッド呼び出しの型エラー

    len(3.14) # 浮動小数点数の長さ取得 # TypeError: object of type 'float' has no len()
  3. 非関数オブジェクトの実行

    result = 100 result() # 数値オブジェクトのコール # TypeError: 'int' object is not callable

カスタム関数でのTypeError発生例

def divide_values(a, b): if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): raise TypeError("引数は数値型のみ受け付けます") return a / b

例外処理の設計原則

比較項目ValueErrorTypeError
発生条件型は正しくても値が不適操作対象の型が不適
処理優先度型検証後に行う最初に型チェック
修正方針入力値の範囲制限型変換または引数の制約
エラーメッセージ具体的な値の問題を示す型の不一致を明記

最適な例外処理手法

  1. 明確な例外分離

    try: user_input = int(input("商品数を入力: ")) except ValueError: print("無効な数値形式です") except TypeError: print("型変換エラーが発生しました")
  2. 防御的プログラミング

    • 関数入力時の型・値検証
    • `isinstance()`による型チェック
    • 範囲検証の条件式追加

タグ: Python exception-handling error-types

6月12日 16:22 投稿