• 异常处理


    错误分类:
    1, 语法错误: 你程序未执行之前,pycharm已经给你做了提示了,
    name
    if 1 > 0;
        pass
    age == 3
    2,逻辑错误:
    num = int(input('>>>'))
    可预知,不可预知的,
    你见过的异常:
    num = int(input('>>>'))  #ValueError
    name  # NameError
    if 1 > 0;  # SyntaxError
    dic = {}
    dic['key']  # KeyError
    li = [1,2,3]
    li[10]  # IndexError
    import ac  # ImportError
    View Code
    什么是异常??
    由错误引发的,而且出现异常就会终止程序.
    为什么要进行异常处理:
    1, 异常就会终止程序,用户体验极差,
    2, 让你的代码不冗余.
    
    
    # 触发IndexError
    l=['egon','aa']
    l[3]
    # 触发KeyError
    dic={'name':'egon'}
    dic['age']
    
    #触发ValueError
    s='hello'
    int(s)
    错误举例
    
    
    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
    更多异
    num1=input('>>: ') #输入一个字符串试试
    if num1.isdigit():
        int(num1) #我们的正统程序放到了这里,其余的都属于异常处理范畴
    elif num1.isspace():
        print('输入的是空格,就执行我这里的逻辑')
    elif len(num1) == 0:
        print('输入的是空,就执行我这里的逻辑')
    else:
        print('其他情情况,执行我这里的逻辑')
    
    '''
    问题一:
    使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂
    
    问题二:
    这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
    使用if判断异常
    异常处理:
    1,if ,异常处理 他只能处理简单的逻辑.
    num = input('>>>')
    if num.isdigit():
        num = int(num)
        if  1<= num <= 5:
            if
    
    else:
        print('有非数字类型....')
    View Code
    总结:
    1.if判断式的异常处理只能针对某一段代码,对于不同的代码段的相同类型的错误你需要写重复的if来进行处理。
    2.在你的程序中频繁的写与程序本身无关,与异常处理有关的if,会使得你的代码可读性极其的差
    3.if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
    2,try.异常处理
    遇到报错信息,防止程序终止,执行另一个语句.
    2.1 单独一个条件.单支.
    try:
        num = int(input('>>>'))  #ValueError
        name  # NameError
        # if 1 > 0;  # SyntaxError
        dic = {}
        dic['key']  # KeyError
        li = [1,2,3]
        li[10]  # IndexError
        import ac  # ImportError
    except NameError:
        print('出现了NameError错误')
    print(111)
    print(222)
    print(333)
    print(114441)
    View Code
    2.2 多分支.
    try:
        num = int(input('>>>'))  #ValueError
        name  # NameError
        dic = {}
        dic['key']  # KeyError
        li = [1,2,3]
        li[10]  # IndexError
        import ac  # ImportError
    except NameError:
        print('出现了NameError错误')
    except ValueError:
        print('出现了ValueError错误')
    except KeyError:
        print('出现了KeyError错误')
    
    print(222)
    print(333)
    print(114441)
    class A:
        def __str__(self):
            return 'list index out of range'
    a1 = A()
    print(a1)
    View Code
    3 万能异常处理.
    try:
        num = int(input('>>>'))  #ValueError
        name  # NameError
        dic = {}
        dic['key']  # KeyError
        li = [1,2,3]
        li[10]  # IndexError
        import ac  # ImportError
    except Exception as e:
        print('您输入的不规范,请重新输入...')
        print('稍等片刻,去去就来...')
    View Code
    异常处理的两种结局方式:
    1,只是显示错误信息,不终止程序就行. 万能的
    2,针对不同的错误,提示不同的信息,进行不同的操作.  多分支
    def login():
        pass
    
    def regsiter():
        pass
    
    def article():
        pass
    
    def dariy():
        pass
    dic = {
        1:login,
        2:regsiter,
        3:article,
        4:dariy,
    }
    while True:
        choice = input('请输入:')
        if choice.isdigit():
            choice = int(choice)
            if 1 <= choice <=4:
                dic[choice]()
    
            else:
                print('请范围内的数字...')
        else:
            print('请输入数字...')
    while True:
        try:
            choice = int(input('请输入:'))
            dic[choice]()
        except ValueError:
            print('请输入数字...')
        except KeyError:
            print('请范围内的数字...')
    View Code
    4 多分支+万能.
    while True:
        try:
            choice = int(input('请输入:'))
            dic[choice]()
        except ValueError:
            print('请输入数字...')
        except Exception as e:
            print(e)
        except KeyError:
            print('请范围内的数字...')
    
    try:
        choice = int(input('请输入:'))
    except ValueError:
        print('请输入数字...')
    except KeyError:
        print('请范围内的数字...')
    except Exception as e:
        print(e)
    View Code
    2.5 try  except except ...  else
    如果程序出现异常执行except,就不会执行else,反之则执行else
    try:
        print('我的卡扣除100元')
        print('旭哥的卡增加了100元')
    except NameError:
        print('转账出现异常...')
    else:
        print('转账成功')
    View Code
    2.6 try  except except ...  else  .finally
    try finally
    try:
        print('我的卡扣除100元')
        name
        print('旭哥的卡增加了100元')
    except NameError:
        print('转账出现异常...')
    else:
        print('转账成功')
    finally:
        print('6666666')
    
    666不执行
    name
    print(666)
    try:
        name
    finally:
        print(666)
    try:
        f = open('t1',encoding='utf-8')
        print(f.read())
        '''多个文件句柄的操作'''
        f.write()
    finally:
    
        f.close()
        print(666)
    最后close()
    f.close()
    
    def func():
        try:
            return 555
        finally:
            '''代码块'''
            print(777)
    func()
    try finally  关闭文件句柄,关闭数据库的链接,关闭网络链接等等
    /
    View Code
    2.7 主动触发异常:
    raise TypeError('类型错误')
    
    class Payment:
        def pay(self,money):
            raise TypeError('你的类中应该用一个pay方法')
    
    class QQ(Payment):
        def pay(self,money):
            print('您用qq支付了%s元' % money)
    
    
    class Wechat(Payment):
        def pay(self,money):
            print('您用微信支付了%s元' % money)
    
    def pay(obj,money):
        obj.pay(money)  # a1.pay(200)
    
    q1 = QQ()
    w1 = Wechat()
    pay(w1,1000)
    View Code
    2.8  自定义异常 (大项目,针对于python不具备的一些错误类型.)
    raise TypeError('类型错误')
    name1 :  python解释器没法解决的错误:   周星星
    
    
    class 周星星(BaseException):
        def __init__(self,msg):
            self.msg=msg
        def __str__(self):
            return self.msg
    
    raise EvaException('EvaException:错误!!!!' )
    raise TypeError('EvaException:错误!!!!' )
    try:
        raise 周星星('EvaException:错误!!!!' )
    except 周星星 as e:  # e = EvaException('类型错误')
        print(e)
    View Code
    断言 源码 主动抛出异常
    condition = 1 > 2
    assert condition  # 如果条件不满足强行终止.
    print(111)
    print(222)
    print(113331)
    print(5455)
    if 1 == 2:
        print(111)
        print(222)
        print(113331)
        print(5455)
    View Code
    总结:
    1,try ...except 单个情况 2,try except except..... 多分支,针对多个你已知的异常,分别导向不同的代码. * 3,try except Exception as e: 万能异常处理. 你对出现的异常错误未知,你要用万能的. * # 1,只是显示错误信息,不终止程序就行. 万能的 # 2,针对不同的错误,提示不同的信息,进行不同的操作. 多分支,多分支+ 万能 4,try except except except Exception as e: 多分支 + 万能 * 5,try except except... else 出现异常就不执行else代码反之则执行. 6, try except except... else,finally 不常用 try finally * 涉及到关闭文件句柄,网络链接,数据库链接等等. 7, raise 8, 自定义异常处理. 9 assert ''' try...except的比较if的方式的好处: try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性 异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性 使用try..except的方式 1:把错误处理和真正的工作分开来 2:代码更易组织,更清晰,复杂的工作任务更容易实现; 3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;
  • 相关阅读:
    python基础-递归
    python基础-三元表达式/列表推导式/生成器表达式
    python基础-生成器
    python基础-迭代器
    python基础-函数
    python基础-文件操作
    Docker(六)安装Red5进行rtmp推流
    Docker(五)安装Fastdfs
    Docker(四)安装Redis
    Docker(三)安装Mysql
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9296890.html
Copyright © 2020-2023  润新知