美文网首页
第十九章 异常处理

第十九章 异常处理

作者: 热爱_生活 | 来源:发表于2020-01-02 20:11 被阅读0次

    一、什么是异常

    异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下:

    image

    而错误分成以下两种情况

    1. 语法错误

    #语法错误一
    if
    #语法错误二
    def test:
        pass
    #语法错误三
    class Foo
        pass
    #语法错误四
    print(haha
    
    

    2. 非语法错误

    # TypeError:int类型不可迭代
    for i in 3:
        pass
    
    # ValueError
    inp=input(">>: ") # 输入 qf
    int(inp)
    
    # NameError
    aaa
    
    # IndexError
    l=['yangge','aa']
    l[3]
    
    # KeyError
    dic={'name':'yangge'}
    dic['age']
    
    # AttributeError
    class Foo:
        pass
    Foo.x
    
    # ZeroDivisionError:无法完成计算
    res1=1/0
    
    


    二、异常的种类

    在python中不同的异常可以用不同的类型(python3中统一了类与类型,类型即类)去标识,一个异常标识一种错误

    # 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
    AttributeError 
    
    # 输入/输出异常;基本上是无法打开文件
    IOError 
    
    # 无法导入模块或包;基本上是路径问题或名称错误
    ImportError 
    
    # 语法错误(的子类) ;代码没有正确对齐
    IndentationError 
    
    # 下标索引超出序列边界,比如当 li 只有三个元素,却试图访问 li[5]
    IndexError 
    
    # 试图访问字典里不存在的键
    KeyError 
    
    #  按了一下 Ctrl+C
    KeyboardInterrupt
    
    # 使用一个还未被赋予对象的变量
    NameError 
    
    # 无效语法,语法错误
    SyntaxError 
    
    # 传入对象类型不符合要求,如sum 函数需要的是 int,但你传入了 str
    TypeError 
    
    # 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
    UnboundLocalError 
    # 例如:
    """
    x = 1
    def func():
        x += 1
        return x
    
    func()
    
    UnboundLocalError: local variable 'x' referenced before assignment
    # 局部变量 x 在赋值之前被引用
    """
    
    # 传入一个调用者不期望的值,即使值的类型是正确的,比如 int('a')
    ValueError 
    
    


    三、异常处理

    为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理,

    如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防

    def func(arg):
            if arg is int:
                arg += 1
            else:
                arg = int(arg)
                arg += 1
            return arg
    
    

    如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理

    基本语法为

    try:
        被检测的代码块
    except 异常类型:
        try中一旦检测到异常,就执行这个位置的逻辑
    
    

    例子

    def func(arg):
        try:
            arg +=1
        except TypeError as e:
            print(e)
    
    func('杨哥')
    
    

    1. 使用正确的异常类型

    异常处理,只可以捕获到声明的异常种类和发生异常的种类相匹配的情况。
    假如发生的异常类型和你指定捕获到异常不能匹配,就无法处理。

    x = '杨哥'
    try:
        int(x)
    except IndexError as e: # 未捕获到异常,程序直接报错
        print(e)
    
    

    2. 处理异常的多分支操作

    x = '杨哥'
    try:
        int(x)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    
    

    3. 万能异常 Exception

    x = '杨哥'
    try:
        int(x)
    except Exception as e:
        print(e)
    
    

    4 多分支异常与万能异常结合使用

    假如对于不同种类的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。 也可以在多分支的最后写一个Exception

    x = '杨哥'
    try:
        x[3]
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    except Exception as e:
        print(e)
    
    

    5. 或者无论出现什么异常,都统一丢弃,或者使用同一段代码逻辑去处理

    所有的异常! 只有一个Exception就足够了,这是不好的做法。

    try:
        print('a'[3])
    except Exception as e:
        print(e)
    
    

    6. 异常的其他结构

    x = '杨哥'
    try:
        int(x)
    except IndexError as e:
        print(e)
    except KeyError as e:
        print(e)
    except ValueError as e:
        print(e)
    else:
        print('try内代码块没有异常则执行我')
    finally:
        print('无论异常与否,都会执行该模块,通常是进行清理工作')
    
    

    7 主动触发异常

    try:
        raise TypeError('类型错误')
    except Exception as e:
        print(e)
    
    


    四、更详细的异常信息输出(生产环境必备)

    import traceback
    
    print('start-->')
    try:
        1 + 'a'
    except TypeError as e:
        print(e)
        print('*' * 30)
        #traceback.print_exc()
        print(traceback.format_exc())
        print('*' * 20)
    
    print('end')
    
    

    相关文章

      网友评论

          本文标题:第十九章 异常处理

          本文链接:https://www.haomeiwen.com/subject/rfzooctx.html