1. 首页
  2. 技术文章

33、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.pyerrors.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

我们程序实际引发的另外两个异常(ValueTooSmallErrorValueTooLargeError)是从此类派生的。这是在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)

输出

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类的构造函数,以接受我们自己的自定义参数salarymessage。然后,使用参数使用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异常处理

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code