当前位置 博文首页 > Python异常处理中容易犯得错误总结

    Python异常处理中容易犯得错误总结

    作者:一撸程猿 时间:2021-08-08 18:37

    目录
    • Python异常处理机制
    • 容易犯的错误1
    • 容易犯的错误2
    • 总结

    Python异常处理机制

    如果try异常处理中存在finally,finally中的代码总会得到执行

    下面例子只是作为演示,不用去纠结业务逻辑

    容易犯的错误1

    看下面的代码,写出输出结果

    def dig_dig1():
        while True:
            print("I'm in while loop")
            try:
                print("I'm in try")
                raise EOFError
            except IOError:
                print("IOEoor")
            finally:
                print("I'm in finally")
                break
    
    
    dig_dig1()
    

    原以为会输出的结果:

    I'm in while loop
    I'm in try
    I'm in finally
    EOFError
    
    Process finished with exit code 1
    

    运行结果

    I'm in while loop
    I'm in try
    I'm in finally
    
    Process finished with exit code 0
    
    1. 如果异常处理中存在finally, finally总会被执行;
    2. 那么在执行finally之前,try中的产生的异常将会被临时保存起来,当finally的代码执行完成后,再抛出异常;
    3. 但当finally中存在raise或return或break时, try中的异常将会被抛弃。

    容易犯的错误2

    看下面的代码,写出输出结果

    def dig_dig2(index):
        try:
            print("I'm in try")
            if index < 0:
                raise IndexError
            else:
                return index
        except IndexError:
            print("I'm in except")
            return "except"
        finally:
            print("I'm in finally")
            return "finally"
    
    
    print(dig_dig2(12))
    

    原以为会输出的结果:

    I'm in try
    12
    

    运行结果

    I'm in try
    I'm in finally
    finally
    
    Process finished with exit code 0
    
    1. 如果异常处理中存在finally, finally总会被执行。
    2. 如果在try块语句中存在return的同时又存在finally块语句,那么将会在执行try块语句中return语句之前去执行finally语句块,然后再回来执行try块语句中return语句。
    3. 但是例子中在finally块语句中存在return语句,整个函数已结束,所以try块语句中return语句将永远得不到执行。

    总结

    一般情况下,如果异常处理中存在finally, finally总会被执行。但是,存在以下情况就需要注意:

    1. 在执行finally之前,try中的产生的异常将会被临时保存起来,当finally的代码执行完成后,再抛出异常; 但当finally中存在raise或return或break时, try中的异常将会被抛弃。
    2. 如果在try块语句中存在return的同时又存在finally块语句,那么将会在执行try块语句中return语句之前去执行finally语句块,然后再回来执行try块语句中return语句。但是在finally块语句中存在return语句,整个函数已结束,所以try块语句中return语句将永远得不到执行。
    jsjbwy
    下一篇:没有了