在本教程中,您将学习如何在示例的帮助下根据您的要求定义自定义异常。
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.”)
这是该程序的示例运行。
输入数字:12 这个值太大了,再试一次! 输入一个数字:0 这个值太小了,再试一次! 输入数字:8 这个值太小了,再试一次! 输入数字:10 恭喜!你猜对了。
我们已经定义了一个名为Error.
我们的程序实际引发的另外两个异常(ValueTooSmallError和ValueTooLargeError)是从这个类派生的。这是 Python 编程中定义用户定义异常的标准方式,但您不仅限于这种方式。
自定义异常类
我们可以根据需要进一步自定义此类以接受其他参数。
要了解自定义 Exception 类,您需要具备面向对象编程的基本知识。
访问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)
输出
输入工资金额:2000 回溯(最近一次调用最后一次): 文件“
在这里,我们重写了Exception类的构造函数以接受我们自己的自定义参数salary和message. 然后,使用 using 参数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)
输出
输入工资金额:2000 回溯(最近一次调用最后一次):
要了解有关如何在 Python 中处理异常的更多信息,请访问Python 异常处理。