2014-09-02 25 views
1

如果raise不在tryexcept子句中,而只是作为函数中的最后一个语句,那么raise会做什么?在“try”或“except”块之外的python函数末尾“raise”

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

    # notice that the "raise" is outside 
    raise 

这个例子打印1,但不是2所以它必须是最后一个raise语句只是提出最后抛出的异常。

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

    print 1 
    raise 
    print 2 

if __name__ == '__main__': 
    foo() 

这种类型的使用模式的任何官方文档?

+3

请参阅http://stackoverflow.com/questions/13957829/how-to-use-raise-keyword-in-python – 2014-09-02 20:53:16

+2

该文档是__literally__在谷歌的第一个结果。 – 2014-09-02 20:54:36

+1

*“它必须是最后一个raise语句只是引发最后抛出的异常”* - 确实如此。 *“这种使用模式的任何官方文档?”* - 请参阅[这里](https://docs.python.org/2.7/reference/simple_stmts.html#the-raise-statement):*“如果没有表达式'raise'会重新生成当前作用域中最后一个活动的异常,如果当前作用域中没有异常处于活动状态,则会引发'TypeError'异常......“* – jonrsharpe 2014-09-02 21:24:20

回答

1

裸露的raise语句会重新引发上次捕获的异常。 https://docs.python.org/2/tutorial/errors.html#raising-exceptions

+0

请参阅编辑 – gli 2014-09-02 21:09:11

+2

,但OP询问有关例外之外的裸露加价 - 这是无效的并导致TypeError异常。 – tdelaney 2014-09-02 21:10:35

+0

我不认为这是无效的。我刚刚运行了一个例子,它没有抛出TypeError异常。 – gli 2014-09-02 21:15:05

1

从这个documentation我们可以看到:

如果没有表情都存在,提高再提高的最后一个异常 在目前的范围是积极的。如果 当前作用域中没有异常处于活动状态,则会引发TypeError异常,表明这是一个错误 (如果在IDLE下运行,则Queue.Empty异常会引发 )。

这意味着,在你的代码的情况下,如果try ... except块中没有异常发生,那么你就迫使该计划提出一个TypeError例外的情况发生。

+0

请参阅编辑 – gli 2014-09-02 21:04:25

1

A Bare raise重新渲染当前异常。这通常是毫无意义的函数结束,除非该函数被调用的异常:

就其本身而言,加薪是无效的和Python抛出自己的异常

>>> def x(): 
...  raise 
>>> x() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in x 
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType 

但是,如果内的所谓异常块,它的作用三立

>>> try: 
...  int('a') 
... except: 
...  x() 
... 
Traceback (most recent call last): 
    File "<stdin>", line 4, in <module> 
    File "<stdin>", line 2, in <module> 
ValueError: invalid literal for int() with base 10: 'a' 
>>> 

编辑

这可能是一个完美的reasona如果函数正在尝试某种恢复,那么该做的事情也是可以做的。该功能可以修复损坏的东西,记录消息,触发灭火器等......并且如果它仍然认为系统出现故障,则为raise

1

正如Russell说,

raise声明再次引发最后捕获的异常。

无论这是否发生在try-except块中,都没有关系。如果发现异常,则拨打raise将重新引发该异常。否则,Python会抱怨之前捕获的异常是None,并且提出TypeError,因为None不是真的可以引发的事情。

由于tdelaney表示,除了在错误处理函数中这样做似乎没有意义。我个人认为它甚至不属于错误处理函数,因为raise应该仍然在except条款中。有人可以使用它来尝试执行代码,而不管是否出现错误,但finally子句是正确的方法。另一种可能性是使用这种方法来确定执行函数时是否发生了错误,但有更好的方法来做到这一点(例如返回一个指示错误发生的额外值)。

+0

快速说明 - 如果该函数用于错误处理,则确实有意义。 – tdelaney 2014-09-02 21:39:07

+0

@tdelaney噢,我忘了提及。 – 2014-09-02 21:43:51