Try–Expect–Finally
try 用于包含可能会引发异常的代码
expect 处理try块中出现的异常
finally 无论是否发生异常,finally中的代码都会被执行
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零")
finally:
print("无论是否有异常,都会执行这部分代码")
不能除以零
无论是否有异常,都会执行这部分代码
raise 是 python 中主动引发异常的关键字。在程序的某些特定情况下,手动抛出异常,让程序进入异常处理流程。
raise引发内置异常
def divide(x, y):
if y == 0:
# 引发内置异常 ZeroDivisionError,并附加自定义的错误信息
raise ZeroDivisionError("除数不能为零,提供的除数为: {}".format(y))
return x / y
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(f"发生异常: {e}")
发生异常: 除数不能为零,提供的除数为: 0
raise引发自定义异常
class CustomError(Exception):
"""这是一个自定义异常类"""
pass
def check_value(value):
if value > 100:
raise CustomError("值超过了允许的范围")
try:
check_value(150)
except CustomError as e:
print(f"捕获到自定义异常: {e}")
捕获到自定义异常: 值超过了允许的范围
重新抛出异常
有时,在 except 块中可能想捕获一个异常并做一些处理,但之后仍然希望将该异常重新抛出,让调用者处理。这可以通过 raise 来实现。
用raise可以在print出错误类型后,报错
第一个不会报错,第二个会报错
try:
10 / 0
except ZeroDivisionError:
print("处理部分异常,但仍然要抛出")
#raise # 重新抛出捕获到的异常
处理部分异常,但仍然要抛出
try:
10 / 0
except ZeroDivisionError:
print("处理部分异常,但仍然要抛出")
raise # 重新抛出捕获到的异常
处理部分异常,但仍然要抛出
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
Cell In[6], line 2
1 try:
----> 2 10 / 0
3 except ZeroDivisionError:
4 print("处理部分异常,但仍然要抛出")
ZeroDivisionError: division by zero
可以抛出具体实例
raise ValueError("这是一个错误")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[7], line 1
----> 1 raise ValueError("这是一个错误")
ValueError: 这是一个错误
引发异常中的上下文传播
try:
10 / 0
except ZeroDivisionError as e:
raise ValueError("错误计算") from e
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
Cell In[9], line 2
1 try:
----> 2 10 / 0
3 except ZeroDivisionError as e:
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
Cell In[9], line 4
2 10 / 0
3 except ZeroDivisionError as e:
----> 4 raise ValueError("错误计算") from e
ValueError: 错误计算
上面例子中,raise from 表示 ValueError 是由 ZeroDivisionError 触发的