Python 异常处理
1.捕获异常 (作用:程序运行过程中,可能会出现意想不到的异常,如果异常未被解决,程序会崩溃,停止运行)
#例如,以下例子 a='name' print(a[10]) #报错:IndexError: string index out of range print('今天是个好天气') #报错后面的程序将不会执行
所以,异常处理就显得很有必要
捕获异常的基础语法:
1.处理异常定义,如果出现异常,我们会让它按照事先规定的规则去执行对应的操作,从而记录报错的log日
2.语法:
try(要运行有可能出现异常的代码):
(缩进)存放可能出现报错的代码模块
except(异常):
(缩进)出现异常的时候要运行的代码(执行的操作),记录日志
一旦try里面的代码报错,会立即跳到except,try报错代码的下面的剩余语句将不会执行
try: a = 'name' print(a[10]) print('今天是个好天气') except: print('try模块存在报错,后续程序不能被执行') 输出结果: try模块存在报错,后续程序不能被执行
3.如果try模块下的代码没有出现异常,则正常执行,不会执行except模块下的代码
try: a = 'name' print(a[2]) print('今天是个好天气') except: print('try模块存在报错,后续程序不能被执行') 输出结果: m 今天是个好天气
4.一般,在写异常处理模块时,都要预先考虑到,可能会出现报错的地方,然后将其放到try里面,从而防止报错影响程序的整体执行
#前期预判 a = 'name' print(a[2]) #a变量是一个字符串,根据索引值取字符串的值,所以可能存在索引值超出字符串的长度的报错 print('今天是个好天气') #案例二 b=12 c=23 print(b*c) #b和c都是变量,如果给予b和c赋予的数据类型非int和float类型,那就会报数据类型的错误,所以此处就需要加 异常处理
5.使用try......except......语句捕获了异常,但是不清楚是哪里出现问题,是数据类型错误、超出范围错误还是其他的错误等等
面对以上的问题,可以使用 except Exception as err:将错误类型赋值给err ,打印出来
try: a = 'name' print(a[20]) print('今天是个好天气') except Exception as err: print('try模块存在报错{},后续程序不能被执行'.format(err)) 输出结果: try模块存在报错string index out of range,后续程序不能被执行
注意:工作当中,最好用以上的方法捕获异常,这样就可以很直观的看到报错的内容,也好定位问题
6.捕获异常的进阶:指明出现的异常类型
方法:先不加异常,执行代码,查看程序可能出现的报错类型,然后将报错的类型加入except 语句中就行
语法:
try:
(缩进)执行的代码模块
except 报错类型 as err:
(缩进)print('异常{}'.format(err))
finally: ---------------->该模块属于,不管有没有报错,里面的代码都会被执行
(缩进) print('你好世界')
lst = ['hello'] a = 4 b = 0 try: print(a/b) print(lst[2]) except IndexError as err: print('出现了异常:{}'.format(err)) except ZeroDivisionError as err: print('出现除法异常:{}'.format(err)) finally: print('hello wold') #结果: ''' 出现除法异常:division by zero 出现除法异常:division by zero hello wold '''
7.手动抛出异常 raise
raise手动抛出异常,让程序终止运行
def join_team(age,gender): if age > 22: raise ValueError('年龄要小于22') print('可以加入team') print(join_team(23,'girl')) ''' raise ValueError('年龄要小于22') ValueError: 年龄要小于22 '''
8.错误类型介绍(以下错误类型,可以接下来了解使用)
ImportError :无法引入模块或包
IndexError:下标索引超出序列边界
NameError:使用一个还未赋予对象的变量
TypeError:传入的对象类型与要求不符合
SyntaxError:代码逻辑语法错误,不能执行,不能捕获
ValueError:传入一个不被期望的值,即使类型不正确
KeyError:试图访问你字典里不存在的key
IOError:输入输出异常,文件操作
9.异常分组
好处:如果我们发现了一个验证级别为阻塞级别的bug,短信通知开发人员马上集合解决问题,如果不同的错误类型,异常处理的行为是一样的,组合起来,就可以简化代码
try: 1 / 0 ['hello'][3] {'name':'pyrhon'}['age'] except (IndexError,KeyError) as e: '短信通知这里出现很严重的问题' print('可以捕获IndexError和KeyError') except ZeroDivisionError as e: '记录日志' print('除法出现异常{}'.format(e))
最好不要直接用Exception,因为可以报错异常,但是也不知道报的是什么异常,再次排查问题时,会很浪费时间