跳到主要内容

Python 自定义异常

提示
  1. 自定义异常的创建:在 Python 中,可以通过从内置 Exception 类派生新类来定义自定义异常,如 CustomError
  2. 使用自定义异常:自定义异常,如 InvalidAgeException,用于特定情景下的错误处理,可以在 try-except 块中捕获和处理。
  3. 异常类的定制:可以定制异常类以接收额外参数,如 SalaryNotInRangeError,并通过重写构造函数来实现更具体的错误信息。

在上一教程中,我们学习了 Python 中不同的内置异常,以及处理异常的重要性。

然而,有时我们可能需要创建符合我们需求的自定义异常。

定义自定义异常

在 Python 中,我们可以通过创建一个从内置 Exception 类派生的新类来定义自定义异常。

下面是定义自定义异常的语法,

class CustomError(Exception):
...
pass

try:
...

except CustomError:
...

在这里,CustomError 是一个从 Exception 类继承的用户定义错误。

注意:

  • 当我们在开发一个大型 Python 程序时,将程序引发的所有用户定义异常放在一个单独的文件中是一个好习惯。

  • 许多标准模块单独定义它们的异常,通常(但不总是)命名为 exceptions.pyerrors.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 类的构造函数,以接受我们自己的自定义参数 salarymessage

然后,使用 super() 手动调用父类 Exception 的构造函数,并传入 self.message 参数。

定义了自定义的 self.salary 属性以供后续使用。

然后使用继承自 Exception 类的 __str__ 方法在引发 SalaryNotInRangeError 时显示相应的消息。