一.什么是异常
异常是错误发生的信号,程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止
二.异常分为三个部分
1️⃣异常的追踪信息
2️⃣异常的类型
3️⃣异常的值
三.异常的分类
1.语法异常(这类异常应该在程序执行前就更改)
print('start....')
try:
print('start....')
x=1
y
l=[]
d=['b']
print('end....')
except NameError
print('变量名没有定义')
print('other...')
y=1 y+=1 if print('stop....')
2.逻辑上的异常
1️⃣IndexError(索引超出列表范围)
l=['a','b'] l[10]
2️⃣keyError(字典Key不存在)
d={'a':1} d['b']
3️⃣AttributeError(属性错误)
class Foo: pass Foo.x import os os.aaa
4️⃣ZeroDivisionError(分母0不能作为除数)
2/0
5️⃣FileNotFoundError(文件未创建错误)
f=open('a.txt','r',encoding='utf-8')
6️⃣ValueError(I/O operation on closed file)
f=open('a.txt','r',encoding='utf-8') f.close() f.readline()7️⃣ ValueError( invalid literal for int() with base 10 : 'bbb' )
int('bbb')
8️⃣TypeError(类型错误)
for i in 111:
pass
9️⃣NameError
x
func()
def func()
import os
os.xxx
func()
语法:分两种单分支和多分支
1️⃣单分支
try:
print('start....')
x=1
y
l=[]
d=['b']
print('end....')
except NameError
print('变量名没有定义')
print('other...')
2️⃣多分支
try:
print('start...')
x=1
y
l=[]
l[2]
d={'a':1}
d['c']
print('end...')
expect NameError:
print('变量名没有定义')
expect KeyError:
print('字典的key不存在')
expect IndexError:
print(‘超出索引范围’)
print('other...')
多种异常采用同一段逻辑处理
try:
print('start.....')
x=1
# y
l=[]
# l[3]
d={'a':1}
d['b']
print('end....')
except (NameError,KeyError,IndexError):
print('变量名或者字典的key或者列表的索引有问题')
print('other....')
3️⃣万能异常
try:
print('start.....')
x=1
# y
l=[]
# l[3]
d={'a':1}
# d['b']
import os
os.aaa
print('end....')
except Exception:
print('万能异常--->')
print('other.....')
4️⃣获取异常的值
try:
print('start.....')
x=1
# y
l=[]
l[3]
d={'a':1}
d['b']
import os
os.aaa
print('end....')
except NameError as e:
print('NameError: ',e)
except KeyError as e:
print('KeyError: ',e)
except Exception as e:
print('万能异常--->',e)
print('other.....')
5️⃣try....else... ,
try...finally....else: 不能单独使用,必须与except连用,意思是:else的子代码块会在被检测的代码没有出现过任何异常的情况下执行
try:
print('start.....')
# x=1
# # y
# l=[]
# l[3]
# d={'a':1}
# d['b']
# import os
# os.aaa
print('end....')
except NameError as e:
print('NameError: ',e)
except KeyError as e:
print('KeyError: ',e)
except Exception as e:
print('万能异常---》',e)
else:
print('在被检测的代码块没有出现任何异常的情况下执行')
print('other.....')
try:
print('start.....')
# x=1
# # y
# l=[]
# l[3]
# d={'a':1}
# d['b']
# import os
# os.aaa
print('end....')
except NameError as e:
print('NameError: ',e)
except KeyError as e:
print('KeyError: ',e)
except Exception as e:
print('万能异常---》',e)
else:
print('在被检测的代码块没有出现任何异常的情况下执行')
finally:
print('无论有没有异常发生,都会执行')
print('other.....')
finally的子代码块中通常放回收系统资源的代码
try:
f=open('a.txt',mode='w',encoding='utf-8')
f.readline()
finally:
f.close()
print('other....')