Python 中的用户定义异常是指你创建的自定义错误类,用于处理代码中的特定错误条件。它们是从内置的 Exception
类或其子类派生出来的。
用户定义异常提供了对应用程序中错误处理的更精确控制:
-
清晰性 — 它们提供了具体的错误信息,明确指出了哪里出了错。
-
-
可维护性 — 它们集中了错误处理逻辑,使你的代码更容易维护。
如何创建用户定义的异常
要创建用户定义的异常,请遵循以下步骤:
步骤 1 - 定义异常类
创建一个新的类,该类继承自内置的 "Exception"
类或任何其他适当的基类。这个新的类将作为你的自定义异常。
class MyCustomError(Exception):
pass
解释
-
继承 — 通过继承自
"Exception"
,你的自定义异常将具有与内置异常相同的行为和属性。
-
类定义 — 使用标准的 Python 类语法定义类。对于简单的自定义异常,可以使用
pass
语句定义一个空的类体。
步骤 2 - 初始化异常
实现 __init__
方法来初始化任何属性或提供自定义错误信息。这允许你在抛出异常时传递特定的错误信息。
class InvalidAgeError(Exception):
def __init__(self, age, message="年龄必须在 18 到 100 之间"):
self.age = age
self.message = message
super().__init__(self.message)
解释
-
属性 — 定义诸如
age
和 message
的属性来存储有关错误的信息。
-
初始化 —
__init__
方法初始化这些属性。super().__init__(self.message)
调用确保基类 Exception
被正确地用错误信息初始化。
-
默认信息 — 提供了一个默认的信息,但在抛出异常时可以覆盖它。
步骤 3 - 可选覆盖 __str__
或 __repr__
覆盖 __str__
或 __repr__
方法以提供异常的自定义字符串表示形式。这对于打印或记录异常非常有用。
class InvalidAgeError(Exception):
def __init__(self, age, message="年龄必须在 18 到 100 之间"):
self.age = age
self.message = message
super().__init__(self.message)
def __str__(self):
return f"{self.message}. 提供的年龄: {self.age}"
解释
-
str 方法 —
__str__
方法返回异常的字符串表示形式。这就是当异常被打印时所显示的内容。
-
自定义信息 — 自定义信息以包含相关的信息,比如本例中的提供的年龄。
抛出用户定义的异常
一旦你定义了一个自定义异常,你可以在代码中抛出它以表示特定的错误条件。抛出用户定义的异常涉及使用 raise
语句,可以带有或不带有自定义信息和属性。
语法
以下是抛出异常的基本语法:
raise ExceptionType(args)
示例
在此示例中,set_age
函数如果年龄超出有效范围则抛出 InvalidAgeError
:
def set_age(age):
if age < 18 or age > 100:
raise InvalidAgeError(age)
print(f"年龄设置为 {age}")
处理用户定义的异常
在 Python 中处理用户定义的异常是指使用 try-except
块来捕捉并响应你的自定义异常代表的具体条件。这允许你的程序优雅地处理错误并继续运行,或者根据抛出的异常类型采取特定的行动。
语法
以下是处理异常的基本语法:
try:
except ExceptionType as e:
示例
在下面的示例中,try
块使用一个无效的年龄调用 set_age
。except
块捕捉到 InvalidAgeError
并打印自定义的错误信息:
try:
set_age(150)
except InvalidAgeError as e:
print(f"无效年龄: {e.age}. {e.message}")
完整示例
结合所有步骤,这里是一个创建和使用用户定义异常的完整示例:
class InvalidAgeError(Exception):
def __init__(self, age, message="年龄必须在 18 到 100 之间"):
self.age = age
self.message = message
super().__init__(self.message)
def __str__(self):
return f"{self.message}. 提供的年龄: {self.age}"
def set_age(age):
if age < 18 or age > 100:
raise InvalidAgeError(age)
print(f"年龄设置为 {age}")
try:
set_age(150)
except InvalidAgeError as e:
print(f"无效年龄: {e.age}. {e.message}")
以上代码的输出如下:
无效年龄: 150. 年龄必须在 18 到 100 之间