2013-10-17 45 views

回答

4

第一個從再次提升的點重新寫入異常的堆棧跟蹤,因此它顯示在行raise err處已經被提出。第二個單獨離開堆棧跟蹤,所以它顯示在<some code>的某個地方被提出。

+5

請注意,區別在於'raise'語句,而不是'except'語句。即使你已經完成了'SomeException as err:',你仍然可以使用「anonymous」'raise'來傳遞異常。 – abarnert

0

According to the documentation,利用自身的raise聲明只是重新引發的最後一個異常的是,在目前的範圍是積極的。 raise err解析err[, None, None]並確定需要提高err

這意味着第一個版本(raise err)會給raise err行作爲堆棧跟蹤的基礎。裸聲raise聲明熄滅並重新引發最後一個錯誤而不觸及它,這將保留原始堆棧跟蹤。

# raise err 
Traceback (most recent call last): 
    File "foo.py", line 4, in <module> 
    raise err 
Exception: bar 

# raise 
Traceback (most recent call last): 
    File "foo.py", line 2, in <module> 
    raise Exception('bar') 
Exception: bar 
0

是的。 except SomeException as err會讓那麼你在那個異常對象的函數調用,如本教程的代碼片段顯示:

except IOError as e: 
    print "I/O error({0}): {1}".format(e.errno, e.strerror) 

然後,您可以再次加註其在任一片段。