• Python异常处理


    一、异常:

    异常:在编译阶段没问题,在执行阶段才报错

     

    查看异常:

      ① 错误代码,从下往上看,找到自己写的代码块

      ② 根据错误类型判断

     

    二、异常处理

    即便放在try语句的内容,在遇到报错之后也会中断这段语句的执行

    报错之后,try里面剩余的代码不会执行,但是在try外面的内容还会继续执行

     

    ① 单分支

    try:
        num = int(input('num>>>').strip())
        print(111)
    except ValueError:
        print('输入的非数字')
    
    print(666)
    
    '''
    num>>>a
    输入的非数字
    666
    '''

     

    ② 多分支

    li = [1,2,3,4,5]
    try:
        num = int(input('num>>>').strip())
        print(li[num-1])
    except ValueError:
        print('输入的非数字')
    except IndexError:
        print('输入的数字超过列表的长度')
    
    print(666)
    
    '''
    num>>>10
    输入的数字超过列表的长度
    666
    '''

     

    ③ 合并多分支

    li = ['a','b','c']
    try :
        num = int(input('num>>>').strip())
        print(li[num-1])
    except (ValueError,IndexError):
        print('输入有误')
    
    print(123)
    
    '''
    num>>>100
    输入有误
    123
    '''

     

    三、万能异常

    Exception 万能异常,一定要配合as语法使用,找出报错的内容

    li = ['a','b','c']
    try :
        import aaa
        open('bbbbbb')
        li.remove(10)
        num = int(input('num>>>').strip())
    except Exception as error:
        print(error)
    
    print(123)
    
    '''
    No module named 'aaa'
    123
    '''

     

    多分支和万能异常同时存在:

    万能异常一定要放在最后,并且加上as语句

     

    四、异常处理中的其他机制

    else

    如果没发生异常,就执行else语句,但是不能脱离except

    else的作用:反馈这段代码顺利执行

     

    当异常发生时,else不执行

    try :
        a1 = 1
        a2 = b
        print(a1 + b2)
    except NameError:
        print('NameError')
    else:
        print('没异常发生')
        
    '''
    NameError
    '''

     

    当异常没产生,执行else

    try :
        a1 = 1
        a2 = 2
        print(a1 + a2)
    except NameError:
        print('NameError')
    else:
        print('没异常发生')
    
    '''
    3
    没异常发生
    '''

     

    finally

    finally 无论如何都要执行,即便程序出错和return会也执行finally,能脱离except
    finally 一般用于收尾工作,比如:关闭文件,写日志,关闭网络资源,关闭数据库连接

    def func():
        try:
            f = open('a')      # 文件存在
            return f.readlines()
        finally:
            f.close()           
            print('关闭文件')    # 虽然return,但执行了finally的代码
    
    
    func()  # 关闭文件

     

    五、主动抛异常

    使用关键字 raise语句自己触发异常

    语法:raise 异常名(异常的内容(字符串))

    raise ValueError('ValueError error')
    #     raise ValueError('ValueError error')
    # ValueError: ValueError error

     

    六、自定义异常

     BaseException 异常类的祖宗

    使用:继承父类BaseException,实现父类的init,传入异常信息

    class CustomException(BaseException):
        def __init__(self,msg):
            super().__init__()
            self.msg = msg
    
        def __str__(self):
            return self.msg
    
    raise CustomException('自定义异常')
    
    '''
        raise CustomException('自定义异常')
    __main__.CustomException: 自定义异常
    '''

    七、断言

    assert 1==1
    print(666)
    
    assert 1==2
    print(777)
    
    '''
        assert 1==2
    AssertionError
    '''

    断言相当于if判断,assert满足才执行下面的代码,如果不满足条件就报错

    八、语法总结:

    try...except

    try...except...else

    try...finally

    try...except...finally

    try...except...else...finally

  • 相关阅读:
    OpenACC 书上的范例代码(Jacobi 迭代),part 4
    WRF 安装备忘
    荒川网格
    位运算骚操作 Part 3
    CUDA compiler driver nvcc 散点 part 2
    稀疏矩阵 part 5
    稀疏矩阵 part 4
    稀疏矩阵 part 3
    稀疏矩阵 part 2
    稀疏矩阵 part 1
  • 原文地址:https://www.cnblogs.com/st-st/p/9629364.html
Copyright © 2020-2023  润新知