• 异常处理


    异常处理

    异常分为两类

    一类异常是语法错误

    空格 缩进 语法规则错误

    这类错误应该在写代码时就避免掉

    一类异常时逻辑错误

    比如input用户输入非法或不完整

    这类错误可以在程序中写代码处理

    异常处理

    运行程序时,遇到错误就要实事先去处理,让程序不因报错而提前结束

    可以提高用户体验,提高容错性

    先认识一下常见的异常

    name  NameError 不定义一个变量就直接使用
    1/0 ZeroDivisionError 不能除以一个0
    l = []
    l[1] IndexError 超出了索引范围
    int('aaa') ValueError 强行转换数据的时候给了一个错误的内容
    d = {}
    d['key'] KeyError 字典取一个不存在的key
    class A:pass
    A.Country AttributeError 访问一个不存在的属性
    a = 1
    a() # TypeError 一个不可被调用的内容被调用了
    import aaa # ModuleNotFoundError 找不到你要调用的模块

    处理异常的方法

    单分支

    try:
        可能发生异常的代码
    except 错误类型:
        处理异常
    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num,goods)
    try:
        choose = int(input('请输入您想选择的商品序号 :'))
        print(l[choose-1])
    except ValueError:
        print('请输入一个数字')

    多分支

    try:
        可能发生异常的代码
    except 错误类型1:
        处理异常
    except 错误类型2:
        处理异常
    
    try:
        可能发生异常的代码
    except (错误类型1,错误类型2...):
        处理异常
    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num,goods)
    try:
        choose = int(input('请输入您想选择的商品序号 :'))
        print(l[choose-1])
    except ValueError:
        print('请输入一个数字')
    except IndexError:
        print('您输入的序号不在商品列表内')
    
    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num,goods)
    try:
        choose = int(input('请输入您想选择的商品序号 :'))
        print(l[choose-1])
        a
    except (ValueError,IndexError):
        print('请输入正确有效的序号')
    except NameError:
        print('发生了一个name error')

    万能异常

    try:
        可能发生异常的代码
    except Exception as e:
        处理异常,并打印或者记录e

    尽量不要使用万能异常,如果使用了万能异常,后面一定要加as

    try:
        a
        [][1]
        {}['key']
        1/0
        import aaa
    except Exception:   # 异常的小祖宗
        print('Exception')

    多分支和万能异常,查看异常信息

    try:
        可能发生异常的代码
    except 错误类型1:
        处理异常
    except 错误类型2:
        处理异常
    except Exception as e:
        处理异常,并打印或者记录e
    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num,goods)
    try:
        choose = int(input('请输入您想选择的商品序号 :'))
        print(l[choose-1])
    except (ValueError,IndexError):
        print('请输入正确有效的序号')
    except Exception as e:
        print(e)
    
    Exception万能异常永远放在所有except分支的最后

    异常处理外的其他机制

    else

    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num,goods)
    
    try:
        choose = int(input('请输入您想选择的商品序号 :'))
        print(l[choose-1])
    except (ValueError,IndexError) as e1:
        print(e1)
        print('请输入一个正常的序号')
    except Exception as e2:
        print(e2)
    else:
        print('执行我啦')

    else: 如果try中的代码顺利的执行完,没有报错,那么就执行else中的代码
    是用来汇报整个try中的代码执行成功用的
    一般情况下 else中的内容都是安全的 不会有报错隐患

    finally

    def wrapper(func):
        def inner(*args,**kwargs):
            try:
                print('before func')
                return func(*args,**kwargs)  #先不执行 等finally执行了之后再执行
            finally:
                print('after func')
        return inner
    
    try:
        f = open('test')
        for line in f:
            a,b = line.strip().split(',')
    finally:
        f.close()
        print('执行我啦')

    finally : 必须执行
    遇到return也先执行finally中的代码
    遇到报错也在程序结束之前先执行finally中的代码

    主动抛异常

    raise 异常名字

    自定义异常

    class Taibai(Exception):
        def __init__(self,msg):
            self.msg = msg
            super().__init__()
        def __str__(self):
            return self.msg
    
    raise Taibai('具体的异常内容')

    断言

    assert 布尔值或一个判断

    条件成立的代码

    assert 后面的是True 就执行下面的代码,后面的是False,就不执行,并报错

    基本只存在在源码中,作用和if想通过,不常用

    自定义异常

    class 班级:
        def __init__(self):
            self.students = ['赵大宝']
    
        def get(self):
            if not self.students:
                raise Empty('学生列表已为空')
            else:
                return self.students.pop()
    
    clas = 班级()
    stu1 = clas.get()
    print(stu1)
    stu2 = clas.get()
    print(stu2)

    异常处理的注意事项

    异常处理不宜加在大段代码外面

    不要写太多个except

    尽量少的使用万能异常,并且一定不要在万能异常内部用pass

    在程序没有完成之前,不要在程序入口处加异常处理

    给代码排错的时候,一定要考虑到已经添加上的异常处理机制

  • 相关阅读:
    隔行变色&&鼠标移入变色
    滚动之固定顶部
    页面滚动之回到顶部
    定时器之秒表
    定时器之小僵尸的移动
    tomcat+spring+https
    域名相关
    【软件创意】智能Goals (android)
    【神一样的作业】二维数组连续的二维子数组的和(元素可以连续)
    【软件工程】敏捷开发方法的总结
  • 原文地址:https://www.cnblogs.com/biulo/p/10665937.html
Copyright © 2020-2023  润新知