0Pricing
Python Academy · レッスン

カスタム例外クラス

独自の例外型を定義して、エラーをより明確に伝えます。

「カスタム例外クラス」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

はじめに

独自例外クラスを使うと、エラー処理を明確かつ自己文書化されたものにでき、呼び出し側で正確に処理しやすくなります。

独自例外が必要な理由

組み込み例外は汎用的すぎます。独自例外を使えば、呼び出し側で関係のない例外を捕捉せず、YOUR ライブラリ固有のエラーだけを捕捉できます。
class AppError(Exception):
    pass
raise AppError('something went wrong')

Exception の継承

class MyError(Exception): pass だけで十分です。BaseException ではなく、必ず Exception を継承してください。
class ValidationError(Exception):
    pass
try:
    raise ValidationError('email is invalid')
except ValidationError as e:
    print(e)

独自属性の追加

class APIError(Exception): def __init__(self, status, message): self.status = status; super().__init__(message)
class APIError(Exception):
    def __init__(self, status, message):
        self.status = status
        super().__init__(message)
try:
    raise APIError(404, 'Not found')
except APIError as e:
    print(e.status, e)

例外の階層

class DBError(AppError): pass のように階層を作成します。呼び出し側は、アプリケーションのエラー全般を AppError で、DBError だけを個別に捕捉できます。
class AppError(Exception): pass
class DBError(AppError): pass
class NetworkError(AppError): pass
try:
    raise DBError('timeout')
except AppError as e:
    print('app error:', e)

独自の __str__ メソッド

__str__ をオーバーライドすると、例外メッセージを表示するときの形式を制御できます。
class RangeError(ValueError):
    def __init__(self, val, lo, hi):
        self.val, self.lo, self.hi = val, lo, hi
    def __str__(self):
        return f'{self.val} not in [{self.lo}, {self.hi}]'
print(RangeError(15, 0, 10))

独自例外の発生

関数内で raise を使って、ドメイン固有のエラーを通知します。これにより、呼び出し側にとって明確な API を作成できます。
class InsufficientFundsError(Exception):
    def __init__(self, needed, available):
        super().__init__(f'Need {needed}, have {available}')
def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(amount, balance)
    return balance - amount
try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)

基底クラスによる捕捉

except AppError はすべてのサブクラス(DBError、NetworkError など)を捕捉します。階層によって、呼び出し側は捕捉範囲を選択できます。
class AppError(Exception): pass
class DBError(AppError): pass
try:
    raise DBError('conn failed')
except AppError:
    print('any app error')

コンテキストマネージャーと例外

独自例外はコンテキストマネージャーと連携できます。class suppressed: __exit__ が True を返すと、例外が抑制されます。
class SuppressValue(Exception): pass
try:
    raise SuppressValue('ignored')
except SuppressValue:
    pass  # suppress silently
print('continued')

独自例外のドキュメント化

いつ例外を発生させるのか、属性が何を意味するのかをドキュメントに記載してください。適切な docstring によって、独自例外が使いやすくなります。
class ConfigError(Exception):
    """Raised when configuration is invalid.
    Attributes:
        key: The invalid config key
    """
    def __init__(self, key, msg):
        super().__init__(msg)
        self.key = key

ベストプラクティス

階層は浅く(2~3レベルに)保ってください。必ず Exception を継承してください。Error で終わる説明的な名前を使用してください。専用の exceptions.py モジュールに配置してください。
# Good structure:
class AppError(Exception): pass
class ValidationError(AppError): pass
class NotFoundError(AppError): pass
print('hierarchy demo')

クイックチェック

システム終了イベントを捕捉しないようにするには、独自例外は何を継承すべきですか?

まとめ

独自例外では、Exception を継承し、__init__ に属性を追加し、__str__ をオーバーライドします。捕捉しやすくするために階層を作成します。exceptions.py モジュールに配置してください。

次へ進みましょう

よくできました。次のレッスンに進んで、学習を続けましょう。

よくある質問

「カスタム例外クラス」レッスンは無料ですか?

はい。「カスタム例外クラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「カスタム例外クラス」で何を学びますか?

独自の例外型を定義して、エラーをより明確に伝えます。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「カスタム例外クラス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 例外を理解する
  2. try / except / else / finally
  3. 例外の発生と再発生
  4. カスタム例外クラス
← Python Academyに戻る