python异常处理exception

背景

人能正常沟通交流后面的逻辑是大家相互遵守语言逻辑和语法规则,类比人类沟通方式程序要能正常运行,必须遵守正确的程序语法规范,计算逻辑等规则,如遇到不符合规范的,程序没法正常往下运行,程序出现了异常,但是设计语言为了解决这些出错点,设置了一系列提示,这些提示就是异常点,python语言怎么捕获异常呢?

捕获异常基本结构

样式1
try# 先执行语句1,如果异常执行语句k, 反之不执行语句k
    执行语句1
    执行语句2
    ...
    执行语句N
except 异常名字:
    语句 k

将可能会出异常的执行语句放到try模块下,如果有异常,且异常名字和 except后面的“异常名字”相同,则执行打印提示语句

如何使用

我们来运行下面这个程序
1.py

print(hello)   # abnormal
print("world") # normal

上面两行语句第一行不符合语法规范,因为hello变量并没有定义。第二行是正常语句,打印一个hello字符串。
上面两行语句执行结果报错信息如下图,从图中可以看出程序遇到报错后并没有往下执行,其实有的错误是无关紧要,怎么让程序遇到错误继续往下呢
在这里插入图片描述
图 1

改进1.py程序,使程序正常运行

2.py

try:
    print(hello)   # abnormal
    print("world") # normal
except NameError:
    print("变量没有定义")

运行结果没有报错,这是怎么做到的呢,其实就是套用捕获异常基本结构,将可能有异常的执行语句放到try模块下,except后面紧接着异常名字,我们从图1的报错信息里冒号前面提取异常名字,这里NameError为异常名字。
在这里插入图片描述
图2 正常运行结果

改进2.py,打印详细异常信息

2.py程序能正常执行,但是没达到预期,有两个瑕疵:

第一个瑕疵点是提示信息不明确。

从图1异常报错信息可以看出,异常名称后面又详细的报错信息,我们可以把这个报错信息打印出来。

3.py

try:
    print(hello)   # abnormal
    print("world") # normal
except NameError as e:
    print(e)

运行结果
在这里插入图片描述
图 3 现在提示信息更加明确了

样式2
try: 	
	语句1
except: 	#语句1异常执行语句2,反之,不执行
	语句2
finally:  #语句1和语句2是否执行,都要执行语句3
	语句3
第二个瑕疵点是try模块下第二条语句 print(“world”) # normal 并没有执行。
改进3.py 打印 world

4.py

try:
    print(hello)   # abnormal
except NameError as e:
    print("NameError: {}".format(e))
finally:
    print("world")  # normal

运行结果,把try下面第二条语句移到finally模块下,不管前面有没有异常都执行finally下面语句
在这里插入图片描述

结构3
try:
	语句1
except:
	语句2
else: #语句1正常时执行语句3,语句1异常执行时执行语句2,不执行语句3
	语句3

图4

需求稍微变一下,要求打印一个完整的hello world

4.py

try:
    print("hello")   # normal
except NameError as e:
    print("NameError: {}".format(e))
else:
    print("world") #normal

在这里插入图片描述
图5 打印hello world

语句1异常
5.py

try:
    print(hello)   # abnormal
except NameError as e:
    print("NameError: {}".format(e))
else:
    print("world") #normal

在这里插入图片描述

结构4
try:
	语句1
except:
	语句2
else: #语句1正常执行语句3,语句1异常执行语句2不执行语句3
	语句3
finally: # 不管语句1,2,3是否执行,都执行语句4
	语句4

6.py

try:
    print(hello)   # abnormal
except NameError as e:
    print("NameError: {}".format(e))
else:
    print("world") #normal
finally:
    print("异常不异常都执行")

在这里插入图片描述
图6

样式1优化: 匹配多条异常
try# 先执行语句1,如果异常执行语句k1
    执行语句1
    执行语句2
    ...
    执行语句N
except name1: #对应语句1异常
    语句 k1
except name2: # 对应语句2异常
	语句 k2
.....
except nameN: #对应语句N异常
	语句 kN
try:
    print("hello")   # normal
    open("1.py")  # abnormal
except NameError as e:
    print("NameError: {}".format(e))
except FileNotFoundError as e:
    print("NameError: {}".format(e))

第一条语句出现异常
在这里插入图片描述
图 7

样式1继续优化:多条异常组合成一条语句
try# 先执行语句1,如果异常执行语句k1
    执行语句1
    执行语句2
    ...
    执行语句N
except (name1, name2,nameN) as e: 
    打印 e
try:
    print("hello")   # normal
    open("1.py")  # abnormal
except (NameError, FileNotFoundError) as e:
    print("NameError: {}".format(e))

运行结果同上
在这里插入图片描述

终极boss: Exception

如果不知道异常名字怎么办,其实所以异常都继承了Exception这个类,
把这个类作为异常名字

try# 先执行语句1,如果异常执行语句k1
    执行语句1
    执行语句2
    ...
    执行语句N
except Exception as e: 
    打印 e

在这里插入图片描述

总结,把上述异常语法结构进行融合

try: #执行下列语句
	语句1
	语句2
	....
	语句N
except exceptionName 集合 as e: # 语句1,..N又异常,打印异常信息
	print(e)
else: # try模块下语句无异常,执行语句N1,有异常,不执行语句N1
	语句 N1
	....
finally: # 不管前面语句是否有异常,都要执行语句Nk
	语句 Nk
	

未来待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值