异常的传递
如果程序中的异常没有被处理,默认情况下会将该异常传递给上一级,如果上一级仍然没有处理,那么会继续向上传递,直至异常被处理或程序崩溃。
接下来,使用一个计算正方形面积的实例来演示异常的传递,该实例由get_width()、calc_area()与show_area()三个函数组成,其中get_width()函数用于计算正方形边长,calc_area()函数用于计算正方形面积,show_area()函数用于展示计算的正方形结果。具体代码如下:
def get_width(): # 计算边长
print("get_width开始执行")
num = int(input("请输入除数:"))
width_len = 10 / num # 发生异常
print("get_width执行结束")
return width_len
def calc_area(): # 计算正方形面积
print("calc_area开始执行")
width_len = get_width()
print("calc_area执行结束")
return width_len * width_len
def show_area(): # 数据展示
try:
print("show_area开始执行")
area_val = calc_area()
print(f"正方形的面积是:{area_val}")
print("show_area执行结束")
except ZeroDivisionError as e:
print(f"捕捉到异常:{e}")
if ``__name__ ``== '``__main__``':
show_area()
上述代码中的函数show_area()为程序入口,该函数调用函数calc_area(),函数calc_area()调用函数get_width()。
get_width()函数使用变量num接收用户输入的除数,通过语句width_len = 10 /num计算正方形的边长,如果用户输入的num值为0,那么程序会引发ZeroDivisionError异常。因为get_width()函数中并没有捕获异常的语句,所以get_width()函数中的异常向上传递到calc_area()函数,而calc_area()函数中也没有捕获异常信息的语句,只能将异常信息继续向上传递给show_area()函数。
show_area()函数中设置了异常捕获语句try-except,当它接收到由calc_area()函数传递来的异常后,会通过try-except捕获到异常信息。
运行程序,根据提示输入0,结果如下所示:
show_area开始执行
calc_area开始执行
get_width开始执行
请输入除数:0
捕捉到异常:division by zero