python函数末尾“ raise”或“ except”以外的“ raise”

gli*_*gli 4 python python-2.7

这是什么raise做的,如果它不是内部tryexcept条款,而只是作为函数的最后一条语句?

def foo(self):
    try:
        # some code that raises an exception
    except Exception as e:
        pass

    # notice that the "raise" is outside
    raise
Run Code Online (Sandbox Code Playgroud)

此示例打印1,但不打印2,因此必须是last raise语句只是引发了最后抛出的异常。

def foo():
    try:
        raise Exception()
    except Exception as e:
        pass

    print 1
    raise
    print 2

if __name__ == '__main__':
    foo()
Run Code Online (Sandbox Code Playgroud)

有关这种使用方式的任何正式文档?

Rob*_*tts 5

正如罗素所说,

一条裸露的raise语句重新引发了最后一个捕获的异常。

这是否在try-except块中发生与否无关紧要。如果存在捕获的异常,则调用raise将重新引发该异常。否则,Python会抱怨先前捕获的异常是,None并引发一个TypeError因为None不能真正引发的异常。

正如tdelaney所说,除了在错误处理函数中执行此操作似乎没有任何意义。我个人会说它甚至不属于错误处理函数,因为raise仍然应该在except子句中。无论是否发生错误,有人都可以使用它来尝试执行代码,但是finally子句是执行此操作的正确方法。另一种可能性是使用它作为确定在执行函数时是否发生错误的方法,但是有很多更好的方法(例如返回表示错误发生/位置的额外值)。


Rus*_*ove 4

一条简单的raise语句会重新引发最后捕获的异常。https://docs.python.org/2/tutorial/errors.html#raise-exceptions

  • 除了 OP 询问异常之外的裸加注 - 这是无效的并导致 TypeError 异常。 (3认同)