Python装饰器使用Try / Except不会引发错误

时间:2015-02-19 00:48:57

标签: python try-catch python-decorators

我正在尝试使用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块的打印...

1 个答案:

答案 0 :(得分:1)

return中的finally会覆盖并取消可能触发finally块的任何异常或函数返回。这在Python Language Reference

中有记录
  

如果存在finally,则指定'清理'处理程序。 try   执行子句,包括任何exceptelse子句。如果   异常发生在任何条款中,并且不处理,   异常暂时保存。执行finally子句。如果   有一个保存的异常,它在最后重新提出   finally条款。 如果finally子句引发另一个异常或   执行returnbreak语句,保存的异常是   丢弃

例如:

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