一、异常处理
1.什么是异常?
程序在运行过程中出现了不可预知的错误
并且该错误没有对应的处理机制,那么就会以异常的形式表现出来
造成的影响就是整个程序无法再正常运行
2.异常的结构:
类型 信息 位置
3.异常的种类
1.语法错误
是你程序立刻就能解决的,这种错误是不能被容忍的
语法上的错误 发现之后应该立刻解决
2.逻辑错误
这种错是可以被容忍的 因为一眼看不出来
针对逻辑上的错误 可以采用异常处理机制进行捕获
常见的错误类型:
NAMERROR 名字错误
SyntaxError 语法错误
KeyError 键不存在
ValueError 值错误
IndexError 索引错误
4.常规异常处理
错误发生之后 会立刻停止代码的运行
执行except语句 比对错误类型
支持多个except
try: name l = [1,2,3] l[111] d = {\'name\':\'jason\'} d[\'password\'] except NameError: print(\'NameError\') except IndexError: print(\'indexerror\') except KeyError: print(\'keyerror\')
finally:
print(\'不管出不出错最后都走这里,可以用来关闭文件等资源\')
5.万能异常处理
try: name l = [1,2,3] l[111] d = {\'name\':\'jason\'} d[\'password\'] except Exception: # 万能异常 所有的异常类型都被捕获 Exception继承BaseExcept,这里也可以写他爸爸 print(\'老子天下无敌\') else: print(\'被检测的代码没有任何的异常发生 才会走else\')(咱也不知道有啥用) finally: print(\'无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我\')(打开文件后不管处不出错都关闭文件)
6.主动抛出异常
# 主动抛异常 if \'egon\' == \'DSB\': pass else: raise TypeError(\'尽说大实话\')
7.异常装饰器
# 异常装饰器,处理函数的异常 def entry_wrap(func): """ 如异常会截图,并返回: {\'error\': type, \'msg\': error_message, \'error_img\': screenshot_path} 如果正常,则返回: {\'content\': function_return_value } """ def wrapper(*args, **kwargs): try: content = func(*args, **kwargs) # 被装饰任务的返回值 result = {\'content\': content} # 正常情况下这样返回 except TypeError as e: # 指名道姓捕捉,try中代码执行遇到TypeError后走这下面 result = {\'error\': \'TypeError\', \'msg\': e} except BaseException as e: # 其他所有异常走这下面 result = {\'error\': \'其他未知错误\', \'msg\': e} if \'error\' in result: try: # 这里可以做一系列功能,如对错误的页面截图,返回结果中增加截图路径 result[\'error_img\'] = \'screenshot_path\' except: pass return result return wrapper @entry_wrap # 函数一旦被装饰,返回结果就由装饰器的返回值决定,不再是函数自己原汁原味的返回结果 def test(name): try: # 正常情况走这里 name += 1 return {\'name\':1,\'age\':2} except: # 捕捉所有异常 name += [] name.split(\'|\') return {\'error\': \'code\', \'msg\': \'error_message\',} finally: # 出不出错最后都一定会走这里,这里面可以进行文件资源关闭操作 pass no_error = test(1) print(no_error) # 正常输出 error_1 = test(\'a|b\') print(error_1) # TypeError error_2 = test([1,2]) print(error_2) # BaseException -> AttributeError """ {\'content\': {\'name\': 1, \'age\': 2}} {\'error\': \'TypeError\', \'msg\': TypeError(\'can only concatenate str (not "list") to str\'), \'error_img\': \'screenshot_path\'} {\'error\': \'其他未知错误\', \'msg\': AttributeError("\'list\' object has no attribute \'split\'"), \'error_img\': \'screenshot_path\'} """
8.自定义异常
class MyError(BaseException): def __init__(self,msg): super().__init__() self.msg=msg def __str__(self): return \'<dfsdf%ssdfsdaf>\' %self.msg # raise MyError(\'我自己定义的异常\') # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法 #异常信息:<dfsdf我自己定义的异常sdfsdaf>
9.断言
l = [1,2,3] assert len(l) < 0 # 断言 预言 # 猜某个数据的状态 猜对了 不影响代码执行 正常走 # 猜错了 直接报错