文章目录

刚刚写Python代码时正好写出了这样的代码。

1
2
3
4
5
6
7
8
9
10
def function():
try:
result = do_something()
except:
handle_exception()
raise
else:
continue_do_something()
finally:
return result

看到这样的代码我顿时陷入了思考!
显然在函数中raisereturn这两个操作都属于退出函数的操作,执行后是不会再继续执行函数内的其他语句的。
而显然在学习Python的异常这方面的语法的时候我们都知道finally表示的是try里面的代码体无论执行是否发生异常最后都一定会执行finally里面的代码。

那么,最后到底是抛出异常还是返回值呢?又或者是发生其他的错误?

我写了三份示例代码,用于验证猜想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
>>> def func():
... try:
... 0 / 0
... except:
... raise
... else:
... return 0
... finally:
... return 1
...
>>> func()
1

>>> def func():
... try:
... 0 / 0
... except:
... return 2
... else:
... return 0
... finally:
... return 1
...
>>> func()
1

>>> def func():
... try:
... pass
... except:
... return 2
... else:
... return 0
... finally:
... raise Exception()
...
>>> func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in func
Exception

显然,当tryexcept或者else里面的raisereturn代码与finally里面的代码发生冲突的时候,最后一定以执行finally里面的代码为准。

所以,在finally里面执行raise或者return的情况下,在tryexcept或者else里面写的raisereturn都是毫无效果的。

最后:finally里面写raise或者return就要再三确认是否会发生冲突

文章目录