Python异常处理中很是容易犯的错误

这是我参与更文挑战的第14天,活动详情查看: 更文挑战python

整理异常处理中finally的两个容易犯的错误。markdown

Python异常处理机制

exception.jpeg

若是try异常处理中存在finally,finally中的代码总会获得执行函数

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

容易犯的错误1

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

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()
复制代码

原觉得会输出的结果:ui

I'm in while loop
I'm in try
I'm in finally
EOFError

Process finished with exit code 1
复制代码

运行结果spa

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

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

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))
复制代码

原觉得会输出的结果:orm

I'm in try
12
复制代码

运行结果get

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语句将永远得不到执行。
相关文章
相关标签/搜索