Pythonでプログラムを書いていると、「不正な入力値を受け取ったときにエラーを出したい」「特定の条件が満たされない場合に処理を止めたい」「API呼び出しの結果が不正だったときに例外を投げたい」という場面が必ず出てきます。
そのときに使うのがraise文です。Pythonで意図的に例外を発生させるための基本的な構文で、try…exceptと組み合わせることで安全なエラーハンドリングが実現できます。しかし「raiseとreturnの使い分けが分からない」「カスタム例外をどう作ればいいか分からない」「どの例外クラスを使えばいいか迷う」という悩みも多く聞かれます。
本記事では、raise文の基本構文から標準例外クラスの種類、try…exceptとの組み合わせ、カスタム例外の作成、実践的な活用例まで、初心者の方でもすぐに実践できるよう体系的に解説します。
- Pythonの例外とは
- raise文の基本構文
- 例外クラスにメッセージを渡してraiseする
- 例外インスタンスをraiseする
- 実行例
- 出力:エラー: 0での除算はできません
- raiseを使った例外の発生
- 実行例
- 出力:入力エラー: 年齢は0以上である必要があります。入力値: -5
- 実行例
Pythonの例外とは

例外の基本概念
例外(Exception)とは、プログラムの実行中に発生する異常な状態のことです。Pythonでは例外が発生すると、そのままでは処理が中断されてエラーメッセージ(トレースバック)が表示されます。
Pythonの例外はすべてクラスとして定義されており、継承関係を持つ階層構造になっています。最上位はBaseExceptionで、通常扱う例外のほとんどはExceptionを継承しています。
# 例外が発生する例
result = 10 / 0 # ZeroDivisionError: division by zero
例外を発生させる理由
プログラムの異常検知
意図しない状態や想定外の値が入力されたときに、明示的に例外を発生させることで「ここで問題が起きた」という事実をプログラムに伝えられます。黙って処理を続けるよりも、エラーを早期に検知して止める方が、後のデバッグが容易になります。
ユーザー入力のバリデーション
関数やAPIが受け取る引数が不正な場合、raiseで例外を発生させることで呼び出し側に問題を通知できます。「この関数には正の整数しか渡せない」というルールをコードで表現する手段として有効です。
エラー時の処理分岐
raiseとtry…exceptを組み合わせることで、エラーの種類に応じた異なる処理を実装できます。ファイルが見つからない場合・ネットワークエラーの場合・入力値が不正な場合など、状況ごとに適切な対応を定義できます。
raise文の基本構文

基本的な使い方
raiseの基本構文は以下のとおりです。
# 例外クラスを直接raiseする
raise ValueError
例外クラスにメッセージを渡してraiseする

raise ValueError("値が不正です")
例外インスタンスをraiseする

error = ValueError("値が不正です") raise error
raiseの後に例外クラスまたは例外インスタンスを指定します。メッセージを伴う形(raise ExceptionClass("メッセージ"))が最も一般的な書き方です。
raise Exception(“エラーメッセージ”) の例
def divide(a, b):
if b == 0:
raise Exception("0での除算はできません")
return a / b
実行例
try: result = divide(10, 0) except Exception as e: print(f"エラー: {e}")
出力:エラー: 0での除算はできません
Exceptionは汎用的な例外クラスですが、実務では後述するより具体的な例外クラスを使うことが推奨されます。
標準例外クラスの種類
ValueError / TypeError / IndexError など
| 例外クラス | 発生する状況 | 使用例 |
|---|---|---|
| ValueError | 値の型は正しいが内容が不正 | 負の数が渡されたとき |
| TypeError | 型が不正 | 文字列に整数を足そうとしたとき |
| IndexError | インデックスが範囲外 | リストの範囲外にアクセスしたとき |
| KeyError | 辞書に存在しないキーへのアクセス | dict[“存在しないキー”]のとき |
| AttributeError | 存在しない属性へのアクセス | オブジェクトにないメソッドを呼んだとき |
| FileNotFoundError | ファイルが存在しない | open()で存在しないファイルを開くとき |
| ZeroDivisionError | 0による除算 | 10 / 0のとき |
| RuntimeError | 実行時の一般的なエラー | カテゴリが明確でないエラー |
状況に合った例外クラスを選ぶことで、エラーの原因がコードを読むだけで分かりやすくなります。
raiseを使った例外の発生
単純な例外発生の例
def check_age(age):
"""年齢の検証"""
if age < 0:
raise ValueError(f"年齢は0以上である必要があります。入力値: {age}")
if age > 150:
raise ValueError(f"年齢が現実的な範囲を超えています。入力値: {age}")
return age
実行例
try: check_age(-5) except ValueError as e: print(f"入力エラー: {e}")
出力:入力エラー: 年齢は0以上である必要があります。入力値: -5
条件に応じた例外の発生
関数内での入力値チェック
def calculate_square_root(n):
"""平方根を計算する(負の数は不可)"""
if not isinstance(n, (int, float)):
raise TypeError(f"数値型が必要です。受け取った型: {type(n).name}")
if n < 0:
raise ValueError(f"負の数の平方根は計算できません。入力値: {n}")
return n ** 0.5
実行例
try: print(calculate_square_root("abc")) except TypeError as e: print(f"型エラー: {e}")
try: print(calculate_square_root(-4)) except ValueError as e: print(f"値エラー: {e}")
ループや処理途中での強制エラー
def process_items(items):
"""リストの各要素を処理する"""
results = []
for i, item in enumerate(items):
if item is None:
raise ValueError(f"インデックス {i} の要素がNoneです。処理を中断します")
results.append(item * 2)
return results
実行例
try: result = process_items([1, 2, None, 4]) except ValueError as e: print(f"処理エラー: {e}")
出力:処理エラー: インデックス 2 の要素がNoneです。処理を中断します
raiseとtry…exceptの組み合わせ
例外を捕捉して処理を制御する方法
def safe_divide(a, b):
if b == 0:
raise ZeroDivisionError("除数に0は指定できません")
return a / b
try…exceptで例外を捕捉して処理を継続
try: result = safe_divide(10, 0) print(f"結果: {result}") except ZeroDivisionError as e: print(f"計算エラー: {e}") result = None # デフォルト値を設定して処理を継続 finally: print("計算処理が完了しました")
複数の例外を個別に捕捉する場合は、exceptを複数記述します。
def fetch_data(data, key):
try:
return data[key]
except KeyError:
raise KeyError(f"キー '{key}' が見つかりません")
except TypeError:
raise TypeError("辞書型のデータが必要です")
try: result = fetch_data({"name": "Taro"}, "age") except KeyError as e: print(f"キーエラー: {e}") except TypeError as e: print(f"型エラー: {e}")
例外情報の取得(as e)
as eを使うことで例外オブジェクトを変数に格納し、エラーメッセージや詳細情報を取得できます。
try:
raise ValueError("サンプルエラー")
except ValueError as e:
print(f"例外クラス: {type(e).name}") # ValueError
print(f"メッセージ: {e}") # サンプルエラー
print(f"引数: {e.args}") # ('サンプルエラー',)
スタックトレース表示の活用
tracebackモジュールの利用
import traceback
def risky_function(): raise RuntimeError("予期しないエラー")
try: risky_function() except RuntimeError as e: # スタックトレースを文字列として取得 error_trace = traceback.format_exc() print("エラー詳細:") print(error_trace)
デバッグやログ記録への応用
import traceback
import logging
logging.basicConfig(level=logging.ERROR)
def process_with_logging(): try: raise ValueError("ログ記録テスト") except ValueError as e: # ロギングにスタックトレースを含めて記録 logging.error("処理中にエラーが発生しました", exc_info=True) raise # 例外を再raiseして呼び出し元に伝える
raiseを引数なしで使うと、捕捉した例外をそのまま再発生させることができます。ログに記録したうえで例外を上位に伝播させる場面でよく使われます。
Pythonの例外処理の詳細については、Python公式ドキュメント「エラーと例外」も参照してください。
カスタム例外の作成とraise
独自例外クラスの定義方法
プロジェクト固有のエラー状態を表現するためにカスタム例外クラスを作成できます。Exceptionクラスを継承して定義するのが基本です。
class ValidationError(Exception):
"""バリデーションエラーの基底クラス"""
pass
class AgeValidationError(ValidationError): """年齢バリデーション専用の例外""" def init(self, age, message="年齢が不正です"): self.age = age self.message = f"{message}(入力値: {age})" super().init(self.message)
class NameValidationError(ValidationError): """名前バリデーション専用の例外""" def init(self, name, message="名前が不正です"): self.name = name self.message = f"{message}(入力値: '{name}')" super().init(self.message)
独自例外をraiseで発生させる方法
Exceptionを継承したクラス作成
def validate_user(name, age):
"""ユーザー情報のバリデーション"""
if not name or len(name.strip()) == 0:
raise NameValidationError(name, "名前を入力してください")
if not isinstance(age, int) or age < 0 or age > 120:
raise AgeValidationError(age, "年齢は0〜120の整数で入力してください")
return {"name": name, "age": age}
実行例
try: user = validate_user("", 25) except NameValidationError as e: print(f"名前エラー: {e}") except AgeValidationError as e: print(f"年齢エラー: {e}") except ValidationError as e: # すべてのバリデーションエラーをまとめて捕捉 print(f"バリデーションエラー: {e}")
エラーメッセージをカスタマイズ
class APIError(Exception):
"""API呼び出しエラーのカスタム例外"""
def init(self, status_code, endpoint, message="APIエラーが発生しました"):
self.status_code = status_code
self.endpoint = endpoint
self.message = f"{message} | ステータス: {status_code} | エンドポイント: {endpoint}"
super().init(self.message)
def __str__(self):
return self.message使用例
try: raise APIError(404, "/api/users", "リソースが見つかりません") except APIError as e: print(e) print(f"ステータスコード: {e.status_code}")
出力:リソースが見つかりません | ステータス: 404 | エンドポイント: /api/users
raiseを使う上での注意点
過剰にraiseを使いすぎない
注意:すべての処理にraiseを使うとコードが複雑になります。Noneを返すだけで十分な場合や、デフォルト値で対応できる場合は例外を使わない選択も重要です。raiseは「本当に異常な状態」を表現するために使います。
例外の適切な階層設計
カスタム例外を作りすぎると管理が難しくなります。基底クラスとなる例外(例:AppError)を定義し、その下に用途別の例外を継承させる階層構造にすることで、まとめて捕捉したり個別に処理したりが柔軟にできます。
# 良い設計例
class AppError(Exception): pass # アプリ全体の基底例外
class DatabaseError(AppError): pass # DB関連エラー
class NetworkError(AppError): pass # ネットワーク関連エラー
class ValidationError(AppError): pass # バリデーションエラー
ユーザーやシステムへの影響を考慮
例外が止める処理とログ出力のバランス
例外を発生させると処理が中断されます。ユーザー向けのアプリケーションでは、例外をそのまま表示するのではなく、分かりやすいエラーメッセージに変換して提示することを忘れないようにしてください。
標準例外とカスタム例外の使い分け
型の不一致にはTypeError、値の不正にはValueErrorなど、Pythonの標準例外で十分に表現できる場合は標準例外を使います。アプリケーション固有のビジネスルール違反や、複数の情報を持たせたい場合にカスタム例外を使うのが適切な設計です。
実践例
関数の入力値検証での例外発生
def create_user(username: str, email: str, age: int) -> dict:
"""ユーザー作成関数"""
# 型チェック
if not isinstance(username, str):
raise TypeError(f"usernameは文字列が必要です: {type(username)}")
if not isinstance(age, int):
raise TypeError(f"ageは整数が必要です: {type(age)}")
# 値のバリデーション
if len(username) < 3:
raise ValueError("ユーザー名は3文字以上必要です")
if "@" not in email:
raise ValueError("メールアドレスの形式が不正です")
if age < 18:
raise ValueError("18歳未満は登録できません")
return {"username": username, "email": email, "age": age}実行例
try: user = create_user("ab", "invalid-email", 15) except (TypeError, ValueError) as e: print(f"ユーザー作成エラー: {e}")
ファイル操作時のエラー処理
import os
class FileProcessError(Exception): """ファイル処理専用のカスタム例外""" pass
def read_config_file(filepath: str) -> str: """設定ファイルを読み込む""" if not os.path.exists(filepath): raise FileNotFoundError(f"設定ファイルが見つかりません: {filepath}")
if not filepath.endswith(".json"):
raise FileProcessError(f"JSONファイルのみ対応しています: {filepath}")
try:
with open(filepath, "r", encoding="utf-8") as f:
return f.read()
except PermissionError:
raise FileProcessError(f"ファイルの読み取り権限がありません: {filepath}")実行例
try: content = read_config_file("config.txt") except FileNotFoundError as e: print(f"ファイルエラー: {e}") except FileProcessError as e: print(f"処理エラー: {e}")
WebアプリやAPIでのraise活用
フォーム入力チェック
class FormValidationError(Exception):
"""フォームバリデーションエラー"""
def init(self, field, message):
self.field = field
self.message = message
super().init(f"{field}: {message}")
def validate_registration_form(form_data: dict): """登録フォームのバリデーション""" required_fields = ["username", "email", "password"]
for field in required_fields:
if field not in form_data or not form_data[field]:
raise FormValidationError(field, "この項目は必須です")
if len(form_data["password"]) < 8:
raise FormValidationError("password", "パスワードは8文字以上必要です")
return True実行例
try: validate_registration_form({"username": "Taro", "email": "[email protected]", "password": "abc"}) except FormValidationError as e: print(f"フォームエラー [{e.field}]: {e.message}")
APIレスポンスの検証と例外処理
class APIResponseError(Exception):
"""APIレスポンスエラー"""
def init(self, status_code, message):
self.status_code = status_code
super().init(f"HTTPステータス {status_code}: {message}")
def parse_api_response(response: dict): """APIレスポンスの検証と解析""" if "status_code" not in response: raise ValueError("レスポンスにstatus_codeが含まれていません")
status = response["status_code"]
if status == 200:
return response.get("data")
elif status == 401:
raise APIResponseError(401, "認証が必要です")
elif status == 404:
raise APIResponseError(404, "リソースが見つかりません")
elif status >= 500:
raise APIResponseError(status, "サーバーエラーが発生しました")
else:
raise APIResponseError(status, "予期しないステータスコードです")実行例
try: data = parse_api_response({"status_code": 404, "data": None}) except APIResponseError as e: print(f"APIエラー: {e}") print(f"ステータスコード: {e.status_code}")
Pythonのraiseとエラーハンドリングの詳しい解説については、IT Biz「Pythonのraise文完全ガイド」、ITさくら「Pythonのtry except例外処理の使い方」、@IT「Pythonの例外処理とraiseの実践的な使い方」も参考にしてください。
Pythonをはじめとするプログラミングの実践的な解説は、kakiro-web.comでも幅広く公開しています。
まとめ
raiseはPythonで例外を発生させる基本手段
raise文はPythonで意図的に例外を発生させるための基本的な構文です。raise ExceptionClass("メッセージ")という形で使い、型・値・状態などが不正な場合にプログラムの異常を明示的に通知できます。
try…exceptと組み合わせることで安全な処理分岐が可能
raiseで発生させた例外をtry…exceptで捕捉することで、エラーの種類に応じた処理分岐が実現できます。as eで例外情報を取得し、tracebackモジュールやloggingと組み合わせることでデバッグ・ログ記録への応用も可能です。
標準例外やカスタム例外を適切に使い分けて、デバッグやエラー管理に活用
型エラーにはTypeError、値の不正にはValueErrorなど標準例外を活用し、アプリケーション固有のルール違反にはカスタム例外を定義することで、読みやすく保守しやすいエラーハンドリングが実現できます。
- 基本構文は
raise ExceptionClass("メッセージ") - 状況に合った標準例外クラスを選ぶとコードの意図が伝わりやすい
- try…exceptと組み合わせてエラーを捕捉・制御する
- 引数なしの
raiseで捕捉した例外を再発生させられる - カスタム例外はExceptionを継承して定義する
- アプリ全体で基底例外クラスを設計すると管理しやすくなる
- raiseの使いすぎを避け「本当に異常な状態」にのみ使う

