Python カスタム例外
Python カスタム例外
このチュートリアルでは、例を使用して、要件に応じてカスタム例外を定義する方法を学習します。
Python には、プログラム内で問題が発生した場合にプログラムにエラーを出力させる多数の組み込み例外があります。
ただし、目的に合わせて独自のカスタム例外を作成する必要がある場合もあります。
カスタム例外の作成
Python では、ユーザーは新しいクラスを作成してカスタム例外を定義できます。この例外クラスは、組み込みの Exception
から直接または間接的に派生する必要があります。 クラス。組み込み例外のほとんども、このクラスから派生しています。
>>> class CustomError(Exception):
... pass
...
>>> raise CustomError
Traceback (most recent call last):
...
__main__.CustomError
>>> raise CustomError("An error occurred")
Traceback (most recent call last):
...
__main__.CustomError: An error occurred
ここでは、CustomError
というユーザー定義の例外を作成しました。 Exception
から継承 クラス。この新しい例外は、他の例外と同様に、raise
を使用して発生させることができます オプションのエラー メッセージを含むステートメント。
大規模な Python プログラムを開発している場合、プログラムが発生させるすべてのユーザー定義の例外を別のファイルに配置することをお勧めします。多くの標準モジュールがこれを行います。例外を exceptions.py
として個別に定義します または errors.py
(常にではありませんが、一般的に)
ユーザー定義の例外クラスは、通常のクラスが実行できるすべてのことを実装できますが、通常は単純で簡潔にします。ほとんどの実装では、カスタム基本クラスを宣言し、この基本クラスから他の例外クラスを派生させます。この概念は、次の例でより明確になります。
例:Python でのユーザー定義の例外
この例では、ユーザー定義の例外をプログラムで使用して、エラーを発生およびキャッチする方法を示します。
このプログラムは、保存された数字を正しく推測するまで、ユーザーに数字の入力を求めます。彼らがそれを理解するのを助けるために、彼らの推測が保存された数よりも大きいか小さいかのヒントが提供されます.
# define Python user-defined exceptions
class Error(Exception):
"""Base class for other exceptions"""
pass
class ValueTooSmallError(Error):
"""Raised when the input value is too small"""
pass
class ValueTooLargeError(Error):
"""Raised when the input value is too large"""
pass
# you need to guess this number
number = 10
# user guesses a number until he/she gets it right
while True:
try:
i_num = int(input("Enter a number: "))
if i_num < number:
raise ValueTooSmallError
elif i_num > number:
raise ValueTooLargeError
break
except ValueTooSmallError:
print("This value is too small, try again!")
print()
except ValueTooLargeError:
print("This value is too large, try again!")
print()
print("Congratulations! You guessed it correctly.")
以下は、このプログラムの実行例です。
Enter a number: 12 This value is too large, try again! Enter a number: 0 This value is too small, try again! Enter a number: 8 This value is too small, try again! Enter a number: 10 Congratulations! You guessed it correctly.
Error
という基本クラスを定義しました .
他の 2 つの例外 (ValueTooSmallError
と ValueTooLargeError
) は、このクラスから派生したものです。これは、Python プログラミングでユーザー定義の例外を定義する標準的な方法ですが、この方法だけに限定されるわけではありません。
例外クラスのカスタマイズ
このクラスをさらにカスタマイズして、必要に応じて他の引数を受け入れることができます。
例外クラスのカスタマイズについて学ぶには、オブジェクト指向プログラミングの基本的な知識が必要です。
Python オブジェクト指向プログラミングにアクセスして、Python でのオブジェクト指向プログラミングの学習を開始してください。
一例を見てみましょう:
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
出力
Enter salary amount: 2000 Traceback (most recent call last): File "<string>", line 17, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
ここでは、Exception
のコンストラクターをオーバーライドしています。 独自のカスタム引数 salary
を受け入れるクラス と message
.次に、親 Exception
のコンストラクター クラスは self.message
で手動で呼び出されます super()
を使用した引数 .
カスタム self.salary
属性は後で使用するように定義されています。
継承された __str__
Exception
のメソッド クラスは、SalaryNotInRangeError
の場合に対応するメッセージを表示するために使用されます。
__str__
をカスタマイズすることもできます メソッド自体をオーバーライドしてください。
class SalaryNotInRangeError(Exception):
"""Exception raised for errors in the input salary.
Attributes:
salary -- input salary which caused the error
message -- explanation of the error
"""
def __init__(self, salary, message="Salary is not in (5000, 15000) range"):
self.salary = salary
self.message = message
super().__init__(self.message)
def __str__(self):
return f'{self.salary} -> {self.message}'
salary = int(input("Enter salary amount: "))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
出力
Enter salary amount: 2000 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 20, in <module> raise SalaryNotInRangeError(salary) __main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range
Python で例外を処理する方法の詳細については、Python の例外処理をご覧ください。
Python