📅  最后修改于: 2020-09-19 15:06:30             🧑  作者: Mango
Python有许多内置的异常,当程序中的某些错误出现时,它们会强制您的程序输出错误。
但是,有时您可能需要创建自己的自定义例外来满足您的目的。
在Python,用户可以通过创建新类来定义自定义异常。必须从内置Exception
类直接或间接派生此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
继承自Exception
类。与其他异常一样,可以使用带有可选错误消息的raise
语句来引发此新异常。
当我们开发大型Python程序时,最好将程序引发的所有用户定义的异常放在单独的文件中。许多标准模块都可以这样做。他们分别将其异常定义为exceptions.py
或errors.py
(通常但并非总是如此)。
用户定义的异常类可以实现普通类可以执行的所有操作,但是我们通常使它们简单明了。大多数实现都声明一个自定义基类,并从该基类派生其他异常类。在下面的示例中,将使该概念更清晰。
在此示例中,我们将说明如何在程序中使用用户定义的异常来引发和捕获错误。
该程序将要求用户输入一个数字,直到他们正确猜出所存储的数字为止。为了帮助他们解决问题,提供了一个提示,提示他们的猜测是否大于或小于存储的数字。
# 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
的基类。
我们程序实际引发的另外两个异常( 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)
输出
Enter salary amount: 2000
Traceback (most recent call last):
File "", line 17, in
raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: Salary is not in (5000, 15000) range
在这里,我们重写了Exception
类的构造函数,以接受我们自己的自定义参数salary
和message
。然后,使用super()
与self.message
参数一起手动调用父Exception
类的self.message
函数。
自定义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
raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: 2000 -> Salary is not in (5000, 15000) range
要了解有关如何在Python处理异常的更多信息,请访问Python异常处理。