异常处理
程序运行过程中有时间会遇到一些错误,比如调用一些没有定义的方法、变量或者有些验证不严格,传入到后台会报各种各样的错误。那么显示这些错误信息对用户来说是不友好的。
在Python中有一套异常处理机制来帮助我们进行错误处理(try...except...
)。finally
当我们认为某些代码可能会出错时,就可以用try
来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except
语句块,执行完except
后,如果有finally
语句块,则执行finally
语句块,至此,执行完毕。
比如调用一个没有定义的key,那么会报错说key不存在。
data={} data['name'] #KeyError: 'name'
加入异常处理之后:
try: data['name'] # except KeyError as e: print('不存在的key',e) #不存在的key 'name'
try代码块写的是可能会保错的代码,except 用来捕捉错误。相当于switch case。
如果有多种错误预判:
data={} data1 = [] try: data1[1] data['name'] except KeyError as e: print('不存在的key',e) except IndexError as e: print('列表操作错误',e) finally: print('执行结束') #=========执行结果========= 列表操作错误 list index out of range 执行结束
加入了一个finally,finally语句是一定会执行的。不管有没有执行except。
也可以把多个错误写到一起。
data={} data1 = [] try: data1[1] data['name'] except (KeyError,IndexError) as e: print('不存在的key',e) finally: print('执行结束') #==========执行结果====== 不存在的key list index out of range 执行结束
虽然写一起减少了代码,但是你不知道到底是哪个报的错。如果这两种错误都是用统一的处理方法的时候可以这么写。
Exception可以抓所有的错误,不建议一开始就使用。
data={} data1 = [] try: open('test.txt') data1[1] data['name'] except (KeyError,IndexError) as e: print('不存在的key',e) except Exception as e: print('未知错误',e) finally: print('执行结束') #=====执行结果========== 未知错误 [Errno 2] No such file or directory: 'test.txt' 执行结束
也可以在加一个else,表示一切正常。
try: a = 1 print(a) except (KeyError,IndexError) as e: print('不存在的key',e) except Exception as e: print('未知错误',e) else: print('一切正常') finally: print('执行结束') #======执行结果==== 1 一切正常 执行结束
自定义异常:
class MyException(Exception): def __init__(self,msg): self.message = msg def __str__(self): return self.message try: raise MyException('我的异常') #触发异常 except MyException as e: print(e) #======执行结果==== 我的异常