Pythonプログラミングにおいて、`ValueError` と `TypeError` は機能的に異なる例外クラスであり、適切な使用方法を理解することが重要です。
ValueError: 値の妥当性エラー
この例外は、引数のデータ型は正しくてもその値が操作可能な範囲外である場合に発生します。
典型的な発生パターン
数値変換の失敗
int("abc123") # 非数値文字列の変換 # ValueError: invalid literal for int() with base 10: 'abc123'無効なリスト検索
numbers = [10, 20, 30] numbers.index(40) # 存在しない要素の検索 # ValueError: 40 is not in list数学関数のドメインエラー
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: 型不一致エラー
この例外は、オブジェクトの型が操作に不適合である場合に発生します。
典型的な発生パターン
演算子の型不一致
"score: " + 90 # 文字列と整数の連結 # TypeError: can only concatenate str (not "int") to strメソッド呼び出しの型エラー
len(3.14) # 浮動小数点数の長さ取得 # TypeError: object of type 'float' has no len()非関数オブジェクトの実行
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
例外処理の設計原則
| 比較項目 | ValueError | TypeError |
|---|---|---|
| 発生条件 | 型は正しくても値が不適 | 操作対象の型が不適 |
| 処理優先度 | 型検証後に行う | 最初に型チェック |
| 修正方針 | 入力値の範囲制限 | 型変換または引数の制約 |
| エラーメッセージ | 具体的な値の問題を示す | 型の不一致を明記 |
最適な例外処理手法
明確な例外分離
try: user_input = int(input("商品数を入力: ")) except ValueError: print("無効な数値形式です") except TypeError: print("型変換エラーが発生しました")防御的プログラミング
- 関数入力時の型・値検証
- `isinstance()`による型チェック
- 範囲検証の条件式追加