异常处理
目录
一、捕捉异常
1.1 什么是异常?
异常就是错误发生的信号,如果此信号不做处理,那么,从本行开始之后的代码都不能正常执行了
1.2 异常结构
错误位置:Traceback
点击可以直接到错误的位置,后面也写出了发生的行数
错误类型:XXXError
错误原因:XXXError冒号后面的内容,报错的详细原因,我们主要看的也是这部分,大致定位错误的原因,便于修改
1.3 异常的种类
1.语法错误(SyntaxError)
是坚决不允许的,遇到之后要立刻改正,否则,代码不能运行
- 逻辑错误
是可以被允许的,但是,我们写逻辑的时候要尽可能的避免逻辑错误的发生
1.4 常见的错误类型
NameError:名字错误
IndexError:索引错误
KeyError:键错误
ValueError:值错误
IndentationError:缩进错误
ZeroDivisionError
...
查看所有错误:
Exception,按住ctrl,点击
1.5 为什么要捕捉异常
当代码中可能会出现一些无法控制的情况报错才应该考虑使用
eg: 使用手机访问网络软件 断网
编写网络爬虫程序请求数据 断网
二、异常处理语法结构
2.1 基本语法结构
try:
待监测的代码(可能会出错的代码)
except 错误类型:
针对上述错误类型制定的方案
"""
try except异常捕捉需要注意
1. 捕捉异常尽量的少用
2. try里面被监测的代码尽量少
3. 在明显没有错误的代码不要被捕捉
"""
练习1:
try:
name
except NameError as e:
print('名字没有被定义就使用了')
# 输出结果:
# 名字没有被定义就使用了
练习2:
try:
l = [11, 22]
print(8)
except NameError as e:
print('名字没有被定义就使用了')
# 报错,错误不一致就会报错!!!
练习3:
try:
print(username)
except NameError as e:
print(e) # name 'username' is not defined
try:
print(username)
except NameError:
print(123) # 123
l = [1, 2, 3, 4]
try:
print(l[5])
except IndexError as e:
print(e) # list index out of range
d = {'username': 'keivn'}
try:
print(d['aa'])
except KeyError as e:
print(e) # 'aa'
try:
print(int('adasd'))
except ValueError as e:
print(e) # invalid literal for int() with base 10: 'adasd'
try:
print(1 / 0)
except ZeroDivisionError as e:
print(e) # division by zero
2.2 查看错误的信息
try:
待监测的代码(可能会出错的代码)
except 错误类型 as e: # e就是系统提示的错误信息
针对上述错误类型制定的方案
也可以打印错误原因:print(e)
练习4:
'''异常处理作用:至少可以保证我们的程序继续往下走'''
try:
name
except NameError as e:
print('名字没有被定义就使用了')
print(e)
# 输出结果:
# 名字没有被定义就使用了
# name 'username' is not defined
2.3 针对不同的错误类型制定不同的解决方案
try:
待监测的代码(可能会出错的代码)
except 错误类型1 as e:
针对上述错误类型1制定的方案
except 错误类型2 as e:
针对上述错误类型2制定的方案
except 错误类型3 as e:
针对上述错误类型3制定的方案
...
发现错误后就跟except中的错误类型对比,然后输出处理结果,不会再执行错误下面的代码
练习5:
try:
l = [11, 22]
print(8)
name
d={'username': 'kevin'}
d['age']
except NameError as e:
print(e)
except indexError as e:
print(e)
except KeyError as e:
print(e)
# 输出结果:
# list index out of range
2.4 万能异常 Exception/BaseException
try:
待监测的代码(可能会出错的代码)
except Exception as e:
针对各种常见的错误类型全部统一处理
或者使用:
try:
待监测的代码(可能会出错的代码)
except BaseException as e:
针对各种常见的错误类型全部统一处理
练习6:
try:
print(username)
except Exception as e:
print(e) # name 'username' is not defined
l = [1, 2, 3, 4]
try:
print(l[6])
except Exception as e:
print(e) # list index out of range
d = {'username': 'kevin'}
try:
print(d['age'])
except Exception as e:
print(e) # 'age'
2.5 结合else使用
try:
待监测的代码(可能会出错的代码)
except Exception as e: # e就是系统提示的错误信息
针对各种常见的错误类型全部统一处理
else:
try的子代码正常运行结束没有任何的报错后 再执行else子代码,try中有错误else则不会执行
练习7:
try:
l = [11, 22]
print(l[6])
except Exception as e:
print(e)
else:
print('嘿嘿嘿,执行else语句')
# 输出结果:
# list index out of range
try:
l = [11, 22]
print(l[1])
except Exception as e:
print(e)
else:
print('嘿嘿嘿,执行else语句')
# 输出结果:
# 22
# 嘿嘿嘿,执行else语句
'''try和else不能单独使用'''
2.6 结合finally使用
try:
待监测的代码(可能会出错的代码)
except Exception as e: # e就是系统提示的错误信息
针对各种常见的错误类型全部统一处理
else:
try的子代码正常运行结束没有任何的报错后 再执行else子代码
finally:
无论try的子代码是否报错 最后都要执行finally子代码
练习8:
try:
l = [1, 2, 3]
print(l[1])
except IndexError as e:
print(e)
else:
print('当被监测的代码没有报错的时候执行else语句')
finally:
print('不管被监测的代码有没有错误,都会走finally语句')
try:
l = [1, 2, 3]
print(l[8])
except IndexError as e:
print(e)
finally:
print('不管被监测的代码有没有错误,都会走finally语句')
三、for循环原理
l = [1, 2, 3]
for i in l:
print(i)
使用迭代器对象+while循环+异常处理,完成for循环迭代取值的功能
l = [1, 2, 3]
# 1.先将列表调用__iter__转变成迭代器对象
res = l.__iter__()
# while循环让迭代器对象反复执行__next__
while True:
# 3.异常捕捉后结束循环
try:
print(next(res))
except StopIteration:
break