2013-03-25 55 views
2

我覺得自己這樣做時,我想捕捉異常,總會遇到一些特定的代碼,然後重新引發原始異常:更好的語法只有在發生異常時纔會重新引發異常?

try: 
    error = False 
    # do something that *might* raise an exception 
except Exception: 
    error = True 
finally: 
    # something I *always* want to run 
    if error: 
     raise 

我使用的標誌,因爲調用raise沒有先前的異常引起了TypeError。如果沒有國旗,是否有更多的Pythonic方法?

回答

9

引發異常的,除了處理:

try: 
    # do something that *might* raise an exception 
except Exception: 
    raise 
finally: 
    # something I *always* want to run 

finally套房總是將要執行的羯羊或你不重新拋出的異常。

documentation

如果finally存在時,它指定一個「清除」處理程序。執行try子句,包括任何exceptelse子句。如果任何一個條款發生異常並且沒有被處理,則異常被臨時保存。 finally子句被執行。如果有保存的異常,則在finally子句末尾再次提出。

注意,如果finally套件使用breakreturn聲明,保存異常丟棄:

如果finally條款執行退貨或break語句,保存異常被丟棄:

def f(): 
    try: 
     1/0 
    finally: 
     return 42 

>>> f() 
42 

,但如果你發出breakcontinuereturntry套件,該套件finally仍執行:

returnbreakcontinue聲明中try套房一try ...... finally語句被執行時,finally子句還「的出路。」執行

注意的Python 2.5之前,你甚至不能結合exceptfinally套房在同一try聲明;見PEP 341: Unified try/except/finally。相反,預計將巢try聲明:

try: 
    try: 
     # some code that could raise an exception 
    except SomeException: 
     # exception handler 
finally: 
    # cleanup code, always executed 
+0

+1,不要忘記機會有用的調試信息添加到例外它超出前... – theodox 2013-03-25 20:24:06

+0

@ Martijn Pieters,所以'finally'塊本質上就像另一個**外**'try ... except'塊一樣? – 2013-03-25 20:25:54

+1

@JaceBrowning:是的。在過去,如果有'except'塊,並且你*有嵌套它們,你就不能使用'finally'。查看http://docs.python.org/2/whatsnew/2.5.html#pep-341-unified-try-except-finally – 2013-03-25 20:27:14

2

finally總是執行,無論在tryexcept塊發生了什麼,或者是否except塊甚至存在。

這兩項將工作:

try: 
    # do something that *might* raise an exception 
finally: 
    # something I *always* want to run 

 

try: 
    # do something that *might* raise an exception 
except Exception: 
    raise 
finally: 
    # something I *always* want to run