在 Python 中,你可以使用 raise
语句显式地抛出异常。抛出异常使你能够表明程序中发生了错误,并通过适当地处理这些异常来控制程序的流程。
抛出异常指的是在程序中显式触发错误条件。这在处理由于错误或意外条件而导致程序无法继续正常执行的情况时非常有用。
在 Python 中,你可以抛出像 ValueError
或 TypeError
这样的内置异常来指示常见的错误状况。此外,你还可以创建并抛出自定义异常。
抛出内置异常
你可以通过创建异常类的实例并使用 raise
语句来抛出任何内置异常。以下是语法:
raise Exception("这是一个通用的异常")
示例
下面是一个示例,当函数接收到无效参数时抛出 ValueError
:
def divide(a, b):
if b == 0:
raise ValueError("不能除以零")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(e)
以上代码的输出如下:
不能除以零
抛出自定义异常
除了内置异常外,你还可以通过创建一个新的继承自基础 Exception
类或其子类的异常类来定义和抛出自定义异常。
示例
下面是一个示例:
class MyCustomError(Exception):
pass
def risky_function():
raise MyCustomError("在 risky_function 中出现了问题")
try:
risky_function()
except MyCustomError as e:
print(e)
以上代码的输出如下:
在 risky_function 中出现了问题
创建自定义异常
自定义异常对于处理特定于应用程序的独特错误条件非常有用,提供了更精确的错误报告和控制。
为了在 Python 中创建自定义异常,你需要定义一个新的继承自内置 Exception
类或其他适当内置异常类的类。这个自定义异常类可以具有额外的属性和方法,以提供关于错误条件的更详细上下文。
示例
在这个示例中:
-
我们定义了一个继承自
Exception
的自定义异常类 InvalidAgeError
;
-
__init__()
方法初始化异常,带有无效年龄和默认错误信息;
-
set_age()
函数如果提供的年龄不在有效范围内,则抛出 InvalidAgeError
。
class InvalidAgeError(Exception):
def __init__(self, age, message="年龄必须在 18 到 100 之间"):
self.age = age
self.message = message
super().__init__(self.message)
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 之间
重新抛出异常
有时,你可能需要捕获一个异常,执行特定的操作(如记录日志、清理或提供额外上下文),然后重新抛出同一个异常以便在调用堆栈的更高级别处处理。
当希望确保在异常发生时执行某些操作但仍允许异常传播以便于更高层次处理时,这很有用。
要在 Python 中重新抛出异常,你可以使用不指定异常的 raise
语句,这将重新抛出当前作用域中活跃的最后一个异常。
示例
在下面的示例中:
-
process_file()
函数试图打开并读取一个文件;
-
如果文件未找到,它打印一条错误消息并重新抛出
FileNotFoundError
异常;
-
def process_file(filename):
try:
with open(filename, "r") as file:
data = file.read()
except FileNotFoundError as e:
print(f"文件未找到: {filename}")
raise
try:
process_file("nonexistentfile.txt")
except FileNotFoundError as e:
print("在更高层次处理异常")
执行以上代码后,我们得到如下输出:
文件未找到: nonexistentfile.txt
在更高层次处理异常