我正在尝试使用Python装饰器以了解它发生了什么,并且我遇到了一个令人头疼的问题。
我的代码是这个(python 2.7.6):
import traceback
def dec(func):
def wrapped(*args, **kwargs):
try:
if flag:
print 'flagged'
else:
print 'unflagged'
except NameError as e:
print 'error?'
raise
finally:
return func(*args, **kwargs)
return wrapped
@dec
def foo(x):
print x
foo(3)
运行时,输出为:
error?
3
我预计调用foo(3)会引发:
NameError: global name 'flag' is not defined
为什么"加注"没有提高?显然,错误被捕获 - 执行Except块的打印...
答案 0 :(得分:1)
return
中的finally
会覆盖并取消可能触发finally
块的任何异常或函数返回。这在Python Language Reference:
如果存在
finally
,则指定'清理'处理程序。try
执行子句,包括任何except
和else
子句。如果 异常发生在任何条款中,并且不处理, 异常暂时保存。执行finally
子句。如果 有一个保存的异常,它在最后重新提出finally
条款。 如果finally
子句引发另一个异常或 执行return
或break
语句,保存的异常是 丢弃强>
例如:
def f():
try:
1/0
finally:
return
f() # No exception
def g():
try:
return 1
finally:
return 0
g() # 0
def h():
try:
raise NameError
finally:
raise TypeError
h() # TypeError