• 异常处理


    程序中难免出现错误,而错误分成两种

        一种是语法错误 : 空格 缩进 语法规则

            应该在我们写代码的时候就避免

        一种是逻辑错误

            应该在程序当中写代码处理

                条件判断

                异常处理

    什么是异常:

    AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
    IOError 输入/输出异常;基本上是无法打开文件
    ImportError 无法引入模块或包;基本上是路径问题或名称错误
    IndentationError 语法错误(的子类) ;代码没有正确对齐
    IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
    KeyError 试图访问字典里不存在的键
    KeyboardInterrupt Ctrl+C被按下
    NameError 使用一个还未被赋予对象的变量
    SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
    TypeError 传入对象类型与要求的不符合
    UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
    导致你以为正在访问它
    ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    常用异常
    ArithmeticError
    AssertionError
    AttributeError
    BaseException
    BufferError
    BytesWarning
    DeprecationWarning
    EnvironmentError
    EOFError
    Exception
    FloatingPointError
    FutureWarning
    GeneratorExit
    ImportError
    ImportWarning
    IndentationError
    IndexError
    IOError
    KeyboardInterrupt
    KeyError
    LookupError
    MemoryError
    NameError
    NotImplementedError
    OSError
    OverflowError
    PendingDeprecationWarning
    ReferenceError
    RuntimeError
    RuntimeWarning
    StandardError
    StopIteration
    SyntaxError
    SyntaxWarning
    SystemError
    SystemExit
    TabError
    TypeError
    UnboundLocalError
    UnicodeDecodeError
    UnicodeEncodeError
    UnicodeError
    UnicodeTranslateError
    UnicodeWarning
    UserWarning
    ValueError
    Warning
    ZeroDivisionError
    更多异常

    异常会导致代码就无法继续执行了

    什么是异常处理

      是我们在运行程序的过程中,如果遇到错误,就去事先处理它 让我的程序不要因为报错而结束

      提高用户体验 提高代码的容错性

    # try:
    #     d = {'key':'value'}
    #     d['name']    # 报错
    #     print('qqxing')
    # except KeyError: # 捕获
    #     pass
    # print('wahaha')

    需要异常处理的地方:有一个结果 是不确定的

        # 从文件里读取

        # 从input接收

        # 爬去各种网页,不存在的网址

    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num, goods)
    choose = int(input('请输入您想选择的商品序号 :'))
    print(l[choose-1])
    例题

    单分支

    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('请输入一个数字')

    l = ['apple','banana','umbrella']
    for num,goods in enumerate(l,1):
        print(num,goods)
    try:
        choose = int(input('请输入您想选择的商品序号 :'))
        print(l[choose-1])
    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])
    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])
    except (ValueError,IndexError):
        print('请输入正确有效的序号')
    except NameError:
        print('发生了一个name error')

     万能异常  能捕获几乎所有的异常

    try:
        a
        [][1]
        {}['key']
        1/0
        import aaa
    except Exception:   # 异常的小祖宗
        print('Exception')
    # 查看异常信息
    def main():
        a
        [][1]
        {}['key']
        1 / 0
        import aaa
    
    try:
        main()
    except Exception as e:   # 异常的小祖宗
        print(e)

    尽量不要用万能异常,如果你用了,一定要写as

    # 多分支和万能异常
    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分支的最后

    异常处理之外其他机制

    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语法
    
    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)
    finally:
        print('执行我啦')
    def func(filename):
        try:
            f = open(filename,'r')
            content = f.read()
            return content
        except Exception as e:
            print(e)
        finally:        # 无论如何都要执行
            f.close()
            print('一定会执行')
    
    ret = func('test')
    print(ret)
    View Code
    def wrapper(func):
        def inner(*args,**kwargs):
            try:
                print('before func')
                return func(*args,**kwargs)
            finally:
                print('after func')
        return inner
    
    try:
        f = open('test')
        for line in f:
            a,b = line.strip().split(',')
    finally:
        f.close()
        print('执行我啦')
    View Code

     else : 如果try中的代码没有错误就执行

     finally : 必须执行

        # 遇到return也先执行finally中的代码

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

    #主动抛异常
    raise ValueError
    # 自定义异常
    class Taibai(Exception):
        def __init__(self,msg):
            self.msg = msg
            super().__init__()
        def __str__(self):
            return self.msg
    
    raise Taibai('具体的异常内容')
    # 断言
    # assert 条件
    
    class Empty(Exception):
        def __init__(self,msg):
            self.msg = msg
            super().__init__()
        def __str__(self):
            return self.msg
    
    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)

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

      # try:

      #     100行代码

      # except:

      #     pass

    2.不要写太多个except

      # try:

      #     三行代码

      # except:

      #     pass

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

    4.在你的程序没有完成之前,不用在程序入口处加异常处理

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

  • 相关阅读:
    关于typedef在struct使用上的一些问题
    软件工程--趣盒--第四次团队作业--软件实现与测试
    趣盒——快速入门手册
    软件工程趣盒软件设计
    软件工程项目需求分析
    在VS2017下配置OpenGL
    破阵子青铜团队介绍以及项目背景介绍
    海客谈瀛洲,烟涛微茫信难求——微信
    第一次作业:扑通扑通 我的IT
    5.线性回归算法
  • 原文地址:https://www.cnblogs.com/Xiao_Xu/p/10656411.html
Copyright © 2020-2023  润新知