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