Python のユーザー定義例外と例
ユーザー定義の例外は、次のクラスを継承する新しいクラスを定義することによって作成されます。 Pythonの組み込み例外 クラスまたはそのサブクラスの 1 つ。これにより、カスタム エラー メッセージを作成し、アプリケーションにとって意味のある方法で特定のエラーを処理できます。
ユーザー定義の例外を作成および使用する手順
Python でユーザー定義の例外を作成して使用するには、次の手順に従います。
- 新しい例外クラスを定義します。 Exception またはそのサブクラスを継承する新しいクラスを作成します。
- 例外を発生させます: raise ステートメントを使用して、特定の条件が発生したときにユーザー定義の例外を発生させます。
- 例外を処理します。 Try-Except ブロックを使用して、ユーザー定義の例外を処理します。
例: この例では、カスタム例外 InvalidAgeError を作成して、年齢の値が有効な範囲 (0 ~ 120) 内に収まるようにします。
Python # Step 1: Define a custom exception class class InvalidAgeError ( Exception ): def __init__ ( self age msg = 'Age must be between 0 and 120' ): self . age = age self . msg = msg super () . __init__ ( self . msg ) def __str__ ( self ): return f ' { self . age } -> { self . msg } ' # Step 2: Use the custom exception in your code def set_age ( age ): if age < 0 or age > 120 : raise InvalidAgeError ( age ) else : print ( f 'Age set to: { age } ' ) # Step 3: Handling the custom exception try : set_age ( 150 ) # This will raise the custom exception except InvalidAgeError as e : print ( e )
出力
150 -> Age must be between 0 and 120
説明:
- InvalidAgeError クラスは Exception を継承します。それは、 __熱い__ 年齢とメッセージを受け入れるメソッド。
- __str__ メソッドは、エラーの読み取り可能な文字列表現を返します。
- set_age() では、年齢が有効な範囲 (0 ~ 120) の外にある場合、例外が発生します。
- try-excel ブロックは例外をキャッチし、エラー メッセージを出力します。
例外クラスのカスタマイズ
カスタム例外を作成するときは、Python の組み込み Exception クラス (または ValueError TypeError などのサブクラス) をサブクラス化します。その後、独自の属性メソッドまたはカスタム ロジックを追加して、例外をより有益なものにすることができます。
追加の属性を追加したりメソッドをオーバーライドしたりして、カスタム例外を強化することもできます。
例: ここでは、エラー コードを追加し、エラー メッセージをカスタマイズすることで、InvalidAgeError を改善します。
Python class InvalidAgeError ( Exception ): def __init__ ( self age msg = 'Age must be between 0 and 120' error_code = 1001 ): self . age = age self . msg = msg self . error_code = error_code super () . __init__ ( self . msg ) def __str__ ( self ): return f '[Error Code { self . error_code } ] { self . age } -> { self . msg } ' try : set_age ( 150 ) # This will raise the custom exception except InvalidAgeError as e : print ( e )
出力
[Error Code 1001] 150 -> Age must be between 0 and 120
説明:
- InvalidAgeError には追加の属性 error_code が追加されました。
- __str__ メソッドは、エラー コードと経過時間の両方を表示するようにオーバーライドされます。
- set_age(150) が実行されると例外が発生し、try-Except ブロックでキャッチされます。
- カスタマイズされたエラー メッセージが出力され、エラーがよりわかりやすくなります。
標準例外を基本クラスとして使用する
場合によっては、Exception から直接継承する代わりに、RuntimeError ValueError などの標準例外をサブクラス化することでカスタム例外を作成できます。これは、カスタム例外を特定の種類のエラーとして扱う必要がある場合に便利です。
例: この例では、標準の組み込み例外である RuntimeError を継承して、カスタム例外 NetworkError を作成する方法を示します。
Python # NetworkError has base RuntimeError and not Exception class NetworkError ( RuntimeError ): def __init__ ( self arg ): self . args = ( arg ) # store as tuple try : raise NetworkError ( 'Connection failed' ) except NetworkError as e : print ( e . args )
出力
('Connection failed') 説明:
- NetworkError は、組み込みの例外タイプである RuntimeError を継承します。
- 発生すると、メッセージはタプルとして args 属性に保存されます。
- 例外が捕捉され、その格納された引数が表示されます。
実際の例: 無効な電子メール エラー
電子メール アドレスが無効な場合にカスタム例外を発生させる簡単な例を次に示します。
Python class InvalidEmailError ( Exception ): def __init__ ( self email msg = 'Invalid email format' ): self . email = email self . msg = msg super () . __init__ ( self . msg ) def __str__ ( self ): return f ' { self . email } -> { self . msg } ' def set_email ( email ): if '@' not in email : raise InvalidEmailError ( email ) print ( f 'Email set to: { email } ' ) try : set_email ( 'userexample.com' ) except InvalidEmailError as e : print ( e )
出力
userexample.com -> Invalid email format
説明:
- 電子メール アドレスを検証するために、新しい例外クラス InvalidEmailError が定義されています。
- 指定された電子メールに「@」が含まれていない場合、例外が発生します。
- try-excel ブロックはエラーを捕捉し、フォーマットされたメッセージを出力します。
ユーザー定義の例外をいつ使用するか?
次のシナリオでは、ユーザー定義の例外を考慮する必要があります。
- アプリケーション内の特定のエラーを表します (例: InvalidAgeError DatabaseConnectionError)。
- より明確で説明的なエラー メッセージを提供します。
- 例外を使用して、関連するエラーのグループを個別に処理します。
ユーザー定義の例外を使用すると、プログラムがより読みやすく、保守しやすくなり、デバッグが容易になります。
おすすめのクイズ クイズの編集 3 つの質問ユーザー定義の例外が Exception ではなく RuntimeError から継承するとどうなりますか?
- あ
以外では捕まえられない
- B
未チェック例外となる
- C
ハンドラーによって実行時関連のエラーとして扱われます。
- D
カスタム属性が失われます
RuntimeError から継承すると、カスタム エラーだけでなくランタイム エラーとしても処理できます。
super().__init__(self.msg) がカスタム例外クラスでよく使用されるのはなぜですか?
- あ
多重継承を防ぐには
- B
基本例外クラスを適切に初期化するには
- C
トレースバックをオーバーライドするには
- D
例外を自動発生させるには
super() を呼び出すと、基本例外がメッセージで正しく初期化されることが保証されます。
カスタム例外が __str__() をオーバーライドし、例外の内部で出力される場合、何が出力されますか?
- あ
オーバーライドされた文字列表現
- B
例外のメモリアドレス
- C
クラス名のみ
- D
repr() が使用されない限り何も起こりません
print(e) は例外オブジェクトの __str__() を呼び出します。
クイズは正常に完了しました スコア : 2 /3 正確さ : 0% ログインして説明を見る 1 /3 1 /3 < Previous 次へ >