Python 自定义异常
- 自定义异常的创建:在 Python 中,可以通过从内置
Exception
类派 生新类来定义自定义异常,如CustomError
。 - 使用自定义异常:自定义异常,如
InvalidAgeException
,用于特定情景下的错误处理,可以在try-except
块中捕获和处理。 - 异常类的定制:可以定制异常类以接收额外参数,如
SalaryNotInRangeError
,并通过重写构造函数来实现更具体的错误信息。
在上一教程中,我们学习了 Python 中不同的内置异常,以及处理异常的重要性。
然而,有时我们可能需要创建符合我们需求的自定义异常。
定义自定义异常
在 Python 中,我们可以通过创建一个从内置 Exception
类派生的新类来定义自定义异常。
下面是定义自定义异常的语法,
class CustomError(Exception):
...
pass
try:
...
except CustomError:
...
在这里,CustomError
是一个从 Exception
类继承的用户定义错误。
注意:
-
当我们在开发一个大型 Python 程序时,将程序引发的所有用户定义异常放在一个单独的文件中是一个好习惯。
-
许多标准模块单独定义它们的异常,通常(但不总是)命名为
exceptions.py
或errors.py
。
示例:Python 用户定义异常
# 定义 Python 用户定义异常
class InvalidAgeException(Exception):
"输入值小于 18 时引发"
pass
# 你需要猜测这个数字
number = 18
try:
input_num = int(input("输入一个数字:"))
if input_num < number:
raise InvalidAgeException
else:
print("有资格投票")
except InvalidAgeException:
print("发生异常:无效年龄")
输出
如果用户输入的 input_num 大于 18,
输入一个数字:45
有资格投票
如果用户输入的 input_num 小于 18,
输入一个数字:14
发生异常:无效年龄
在上面的示例中,我们通过创建一个从内置 Exception
类派生的新类来定义了自定义异常 InvalidAgeException
。
在这里,当 input_num 小于 18 时,此代码会生成一个异常。
发生异常时,try
块内的其余代码将被跳过。
except
块捕获用户定义的 InvalidAgeException
异常,并执行 except
块内的语句。
定制异常类
我们可以进一步定制这个类,根据我们的需求接受其他参数。
要了解如何定制异常类,你需要具备面向对象编程的基本知识。
访问 Python 面向对象编程 来学习 Python 中的面向对象编程。
让我们看一个示例,
class SalaryNotInRangeError(Exception):
"""引发输入工资错误的异常。
属性:
salary -- 导致错误的输入工资
message -- 错误的解释
"""
def __init__(self, salary, message="工资不在 (5000, 15000) 范围内"):
self.salary = salary
self.message = message
super().__init__(self.message)
salary = int(input("输入工资金额:"))
if not 5000 < salary < 15000:
raise SalaryNotInRangeError(salary)
输出
输入工资金额:2000
Traceback (most recent call last):
File "<string>", line 17, in <module>
raise SalaryNotInRangeError(salary)
__main__.SalaryNotInRangeError: 工资不在 (5000, 15000) 范围内
在这里,我们重写了 Exception
类的构造函数,以接受我们自己的自定义参数 salary
和 message
。
然后,使用 super()
手动调用父类 Exception
的构造函数,并传入 self.message
参数。
定义了自定义的 self.salary
属性以供后续使用。
然后使用继承自 Exception
类的 __str__
方法在引发 SalaryNotInRangeError
时显示相应的消息。