八、异常的捕获和异常的传递性--附代码案例

本文详细介绍了Python中的异常处理,包括异常的捕获方法,如捕获常规异常、指定异常、多个异常,以及异常的else和finally子句。异常的传递性也得到了阐述,说明了如何在函数调用链中处理异常。通过实例展示了如何优雅地处理程序运行时可能遇到的错误,避免因小bug导致整个程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.1 异常

定义:程序运行过程中出现的错误,也就是常说的BUG。
在这里插入图片描述
举例:以r方式打开一个不存在的文件,提示FileNotFoundError错误,表示文件没找到,同时告诉代码在第几行报错。
在这里插入图片描述

8.2 异常的捕获方法

问题:之前的学子中当程序遇到bug,整个程序因为一个bug停止运行。但在真实工作中不能因为一个小的BUG就让整个程序全部奔溃。
异常处理(捕获异常):对可能出现的bug进行提醒、提前准备、提前处理的行为。

8.2.1 捕获常规异常

# 语法:捕获常规异常,不管是什么类型的异常,都会被捕获
try:
	可能发生错误的代码
except:
	如果出现异常执行的代码

# 语法2:捕获所有异常,跟语法1是一个意思
try:
	可能发生错误的代码
except Exception as e:		# 通过捕获Exception类的全部对象,就可以捕获到全部异常
	如果出现异常执行的代码

作用:在所属try语句中提前假设某处会出现异常,做好提前准备;当真的出现异常的时候,可以在所属except语句块中对出现异常的代码进行处理,except接收try报出来的错误使得try不抛出异常,不会让程序停止工作。
举例1:尝试以r模式打开文件,如果文件不存在,则以w方式打开。
在这里插入图片描述
举例2:

try:
    print(name)
except Exception as e:
    print('出现异常')		# 无论出现哪种异常,都会输出异常
    print(e)				# 打印异常:name 'name' is not defined

8.2.2 捕获指定异常

# 语法1:捕获指定异常
try:
	可能发生错误的代码
except 异常类型 : as 别名:
	如果出现异常执行的代码

说明:①as作用是给指定的异常类型取个别名,取别名是为了不输出冗长的异常类型。
注意:① 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
② 一般try下方只放一行尝试执行的代码。

try:
    print(name)
except NameError as e:
    print('name变量名称未定义错误')		# name变量名称未定义错误
    print(e)							# 打印异常:name 'name' is not defined

8.2.3 捕获多个异常

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except后,并使用元组的方式进行书写。

# 语法:捕获多个异常
try:
	可能发生错误的代码
except (异常类型1, 异常类型2) : as 别名:
	如果出现异常执行的代码

举例:

try:
    1 / 0
    print(name)
except (NameError, ZeroDivisionError) as e:
    print("出现了变量未定义 或者 除以0的异常错误")

8.2.4 异常的else

else表示的是如果没有异常要执行的代码。

# 语法:异常的else
try:
	可能发生错误的代码
except 异常类型 : as 别名:
	如果出现异常执行的代码
else:
	如果不出现异常执行的代码

举例:

try:
    print('可能发生错误的代码')
except Exception as e:
    print("如果出现异常执行的代码")
else:
    print("如果不出现异常执行的代码")

8.2.5 异常的finally

finally表示无论是否异常都要执行的代码。

# 语法:异常的finally
try:
	可能发生错误的代码
except 异常类型 : as 别名:
	如果出现异常执行的代码
else:
	如果不出现异常执行的代码
finally:
	无论是否异常都要执行的代码

举例:

# 捕获所有异常
try:
    f = open("D:/123.txt", "r", encoding="UTF-8")
except Exception as e:
    print("出现异常了")
    f = open("D:/123.txt", "w", encoding="UTF-8")
else:
    print("好高兴,没有异常。")
finally:
    print("我是finally,有没有异常我都要执行")
    f.close()

对于捕获异常的语法,try和except是必要元素,else和finally是可选元素。

8.3 异常的传递

当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,当func02也没有捕获处理这个异常的时候,main函数会捕获这个异常, 这就是异常的传递性。

# 定义一个出现异常的方法
def func01():
    print("func1 开始执行")
    num = 1 / 0     			# 除以0的异常
    print("func01 结束执行")

def func02():					# 定义一个无异常的方法func02,调用func01
    print("func02 开始执行")
    func01()
    print("func02 结束执行")

def main():						# 定义一个方法main,调用func02
    func02()

main()

如下图可知,报错提示从下往上看,说明异常是具有传递性的。
作用:捕获异常不一定要深入到真正出现异常的那句话。如果函数之间有调用关系,加上异常的传递性,可以在最顶级的调用(主函数)处执行捕获异常的代码。
在这里插入图片描述
修改main()函数代码如下:

def main():
    try:
        func02()
    except Exception as e:
        print(f"出现异常了,异常的信息是:{e}")

在这里插入图片描述

码字不易,如果大家觉得有用,请高抬贵手给一个赞让文章上推荐让更多的人看到吧,也可以评论提出意见让后面的文章内容越来越生动丰富。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值