异常处理
一、捕获异常
1.背景:即程序出现了意想不到的情况,bug,如果异常不解决,程序会崩溃,停止运行
lst = ['hello']#此处有很多行代码
print(lst[9])#异常,取不到索引为9的数据print('running')#后面的代码都无法再正常运行
.
.
.
最基础的异常捕获
2.异常捕获(捕获异常)
如果出现异常,我们会让它按照事先规定的规则去执行对应的操作,记录错误日志:log
语法:
try(要运行有可能出现异常的代码):
要运行的代码
except(异常):
出现异常的时候要运行的代码(执行的操作),记录日志
注:1.try的语句会执行,不然就不会报错了。
2.一旦try里面的代码报错,立即跳到except,try报错代码的下面的剩余语句将不会执行
lst = ['hello']try:print(lst[9])except:print('记录错误日志')print('running....')print('finish')'''
记录错误日志
running....
finish
'''
3.如果try里面的代码没有出现异常,就不会执行except
lst = ['hello']try:print(lst[0])print('python-lemon')#try里面没有异常,都会执行完,不会进入except
except:print('记录错误日志')print('running....')'''
hello
python-lemon
running....
'''
3.try......except Exception as err......
好的程序员:知道什么代码需要放到try里面
#需不需要加异常??
a = 4b= 2
print(a*b)
a,b是变量,事先不知道是什么数据类型,就需要加异常,否则如果输入的是字符串,列表啥的,就会报错;如果事先知道就是int/float,就不需要加异常
a = '4'b= 'q'
try:print(a*b)except:print('参数错误,记录日志')
上面的try.....except....捕获了异常,但是不知道到底是哪里出了bug.下面用:except Exception as err.会把错误类型赋值给err
a = 4b=0try:print(a/b)exceptException as err:print('出现了异常:{}'.format(err))#结果:出现了异常:division by zero
在实际操作中,最好用这个方法(try......except Exception as err......)。
4.异常捕获的进阶:指明出现的异常类型
先不要加异常,让它报错(开发主动报错),将报错的类型记住,去异常捕获的时候,加入except语句中
语法:
try:
代码
except 错误类型 as err:
print('异常{}'.format(err))
finally:-------------------→不管有没有报错,finally里面的代码都会执行。
print('hello word')
lst = ['hello']
a= 4b=0try:print(a/b)print(lst[2])exceptIndexError as err:print('出现了异常:{}'.format(err))exceptZeroDivisionError as err:print('出现除法异常:{}'.format(err))finally:print('hello wold')#结果:
'''
出现除法异常:division by zero
出现除法异常:division by zero
hello wold
'''
二、手动抛出异常raise
raise手动抛出异常,让程序终止运行
defjoin_team(age,gender):if age > 22:raise ValueError('年龄要小于22')print('可以加入team')print(join_team(23,'girl'))'''
raise ValueError('年龄要小于22')
ValueError: 年龄要小于22
'''
错误类型介绍
ImportError:无法引入模块或包
IndexError:下标索引超出序列边界
NameError:使用一个还未赋予对象的变量
SyntaxError:代码逻辑语法错误,不能执行,不能捕获
TypeError:传入的对象类型与要求不符合
ValueError:传入一个不被期望的值,即使类型正确
KeyError:试图访问你字典里不存在的key
IOError:输入输出异常,文件按操作
1.SyntaxError --------语法错误不能被捕获
try:
ldljsdjlg'khkhkh'
except:print('语法错误')#结果显示错误,不能捕获异常
'''
ldljsdjlg'khkhkh'
^
SyntaxError: invalid syntax
'''
2.KeyError
dict1 = {'1':'one','2':'two'}print(dict1['3'])'''
print(dict1['3'])
KeyError: '3'
'''
3.IndexError
lst2 = [1,5,[8,9],'hello']print(lst2[5])'''
print(lst2[5])
IndexError: list index out of range
'''
4.ValueError
a = 4
print(int('a'))'''print(int('a'))
ValueError: invalid literal for int() with base 10: 'a''''
三、异常分组
好处:如果你们发现了一个验证级别为阻塞级别的bug,短信通知开发人员马上集合解决问题
如果不同的错误类型,异常处理的行为是一样的(短信通知),组合起来,可以简化代码。
try:1 /0
['hello'][3]
{'name':'pyrhon'}['age']except(IndexError,KeyError) as e:'短信通知这里出现很严重的问题'
print('可以捕获IndexError和KeyError')exceptZeroDivisionError as e:'记录日志'
print('除法出现异常{}'.format(e))
最好不要直接用Exception,因为自己都不知道报什么错!------------最好避免!
try:1/0exceptException as e:print('其他类型的异常')
四、了解即可
try:
.....
except :
.......
else:
........