异常处理
什么是异常:
异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止
异常处理的三个特征:异常的追踪信息 异常的类型 异常的内容
为何处理异常:
为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序
而是捕捉异常并处理:将出错信息记录到日志内
如何处理异常?
两种错误:
语法上的错误SyntaxError:必须在程序运行前就改正
逻辑上的错误:
第一种:错误发生的条件是可以预知的,使用if判断来解决
第二种:错误发生的条件是无法预知的,我们需要来捕捉异常
try:
被检测的代码块(执行过程中抛出异常,该行代码同级别的后续代码不会运行)
except 异常类型1:
检测到异常,就执行这个位置的逻辑
except 异常类型2:
检测到异常,就执行这个位置的逻辑
except Exception(万能异常):
所有异常都可以匹配的到
。。。
else(else不能单独与try配合使用,必须要搭配except):
如果被检测的子代码块没有异常发生,则会执行else的子代码
finally(finally可以单独与try配合使用):
不处理异常,无论被检测的子代码块有无异常发生,都会执行finally的子代码
异常处理的用法
用法一:try + except
print('start...')
try:
print('1111111111')
l=['aaa','bbbb']
l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic={'a':1}
dic['a']
except IndexError as e:
print('异常的信息: ',e)
print('end....')
用法二:try + 多分支的except
print('start...')
try:
print('1111111111')
l=['aaa','bbbb']
# l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic={'a':1}
dic['a']
except IndexError as e:
print('异常的信息: ',e)
except NameError as e:
print('异常的信息: ',e)
print('end....')
用法三:try + except Exception(万能异常)
print('start...')
try:
print('1111111111')
l = ['aaa', 'bbbb']
l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic = {'a': 1}
dic['aaa']
# except (IndexError, NameError) as e:
# print('异常的信息: ', e)
# except KeyError as e:
# print('字典的key不存在: ', e)
except Exception as e: # 万能异常
print('所有异常都可以匹配的到')
print('end....')
用法四:try + except + else(不能单独与try配合使用,必须要搭配except)
try:
print('1111111111')
print('2222222222')
print('33333333')
except Exception as e: # 万能异常
print('所有异常都可以匹配的到')
else:
print('====>')
print('end....')
用法五:try + finally (finally可以单独与try配合使用)
try + except + finally
try + except + else + finally
print('start...')
try:
print('1111111111')
l = ['aaa', 'bbbb']
l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
print('2222222222')
xxx
print('33333333')
dic = {'a': 1}
dic['aaa']
finally: # 不处理异常,无论是否发生异常都会执行finally的子代码
print('====》》》》》应该把被检测代码中回收系统资源的代码放到这里')
print('end....')
异常处理的使用场景
何时使用:在了解了异常处理机制后,本着提高程序容错性和可靠性的目的,读者可能会错误地认为应该尽可能多地为程序加上try...except...,
这其是在过度消费程序的可读性,因为try...except本来就是你附加给程序的一种额外的逻辑,与你的主要工作是没有多大关系的。
如果错误发生的条件是“可预知的”,我们应该用if判断来进行”预防”