python异常处理 异常装饰器 抛出异常 断言

一、异常处理

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  # 断言  预言
# 猜某个数据的状态 猜对了 不影响代码执行 正常走
# 猜错了  直接报错

 

posted @ 2019-08-08 21:59  www.pu  Views(463)  Comments(0Edit  收藏  举报