2010-11-11 85 views
6

一個Python新手的問題,如何來執行的東西:我需要做下面的如果任何異常情況發生

try: 
    do-something() 
except error1: 
    ... 
except error2: 
    ... 
except: 
    ... 
#Here I need to do something if any exception of the above exception was thrown. 

我可以設置一個標誌,並做到這一點。但是,有沒有更乾淨的方式來做到這一點?

+0

設置標誌有什麼不乾淨?我的意思是,「if」陳述通常被認爲是無害的... – detly 2010-11-11 06:11:24

+1

+1。否則你會把事情與一個額外的嵌套層次混淆。也許有更好的方法來構建代碼流程,所以你根本不需要這麼做 – 2010-11-11 06:15:55

+0

@detly關於一面旗子是什麼不乾淨?錯誤處理很容易。如果您可以使用結構化替換標誌解決方案,這通常是一種改進。所以,是的,如果沒有其他簡短的方法,那麼一面旗子可能是做這件事的正確方法之一,但這是最後的手段。 – Alfe 2017-06-07 09:22:23

回答

2

我剛剛嘗試了一些不同的想法,它看起來像一個國旗是你最好的選擇。如果沒有異常

  • 其他套件只叫
  • 最後總是會被稱爲
+2

可能在else子句中設置得最好。 – aaronasterling 2010-11-11 05:54:04

1

從文檔:http://docs.python.org/reference/compound_stmts.html#finally

如果最後存在時,它指定了一個「清除」的處理程序。 try子句被執行,包括任何except和else子句。如果任何一個條款發生異常並且沒有被處理,則異常被臨時保存。 finally子句被執行。如果有一個保存的異常,它會在finally子句結尾處重新提出。如果finally子句引發另一個異常或執行返回或中斷語句,則保存的異常將丟失。在執行finally子句期間,程序不能使用異常信息。

+6

即使存在** no **異常,也會執行'finally'子句的主體。我不認爲這是OP想要的。 – detly 2010-11-11 05:25:09

+0

是的。終於會永遠執行。我想要與其他方面相反的東西。 – amit 2010-11-11 05:48:48

0

目前尚不清楚,如果你需要不同的處理ERROR1,誤差2等。如果沒有,那麼以下代碼將這樣的伎倆:

try: 
    do_something() 
except (error1, error2, error3), exception_variable: 
    handle_any_of_these_exceptions() 

如果你確實需要以不同的方式處理不同的錯誤,以及具有公共代碼,然後在except塊,你可以有FOL的代碼降低型:

if isinstance(exception_variable, error1): 
     do_things_specific_to_error1() 
+0

我需要做不同的事情。使用isinstance看起來像unpythonic,但絕對是一種選擇。 – amit 2010-11-11 05:59:08

+0

@amit我普遍認爲'isinstance'是一件壞事,但'except'只是基於它們的類型開始時才隱含地使用它。我認爲這是適當的。 – aaronasterling 2010-11-11 06:07:47

0

這是我能想到的最好的方式。看起來像一個代碼味道雖然

try: 
    exception_flag = True 
    do-something() 
    exception_flag = False 
except error1: 
    ... 
except error2: 
    ... 
except: 
    ... 
finally: 
    if exception_flag: 
    ... 

你不會需要finally如果你不是在處理reraising例外

2

可以與外try的嵌套try.except塊做到這一點應該抓住所有例外。它的身體是另一個try,立即重新引發異常。內部tryexcept塊實際上處理個別異常。您可以使用內部try中的finally塊來做你想做的事情:在發生任何異常之後運行某些東西,但只能在發生異常之後運行。

這是一個小小的交互式示例(以Applesoft BASIC爲基礎,用於懷舊目的)。

try: 
    input("]") # for Python 3: eval(input("]")) 
except: 
    try: 
     raise 
    except SyntaxError: 
     print "?SYNTAX", 
    except ValueError: 
     print "?ILLEGAL QUANTITY", 
    # additional handlers here 
    except: 
     print "?UNKNOWN", 
    finally: 
     print "ERROR" 
1

其實我不喜歡旗幟,並認爲它們是最後的解決方案。在這種情況下我會考慮這樣的事情:

def f(): 
    try: 
    do_something() 
    except E1: 
    handle_E1() 
    except E2: 
    handle_E2() 
    else: 
    return 
    do_stuff_to_be_done_in_case_any_exception_occurred() 

當然,這僅僅是一種選擇,如果你能在else:情況下返回。

另一種選擇可能是重新拋出異常並將其重新拋出以進行更一般的錯誤處理。這甚至可能是最乾淨的方法:

def f(): 
    try: # general error handling 
    try: # specific error handling 
     do_something() 
    except E1: 
     handle_E1() 
     raise 
    except E2: 
     handle_E2() 
     raise 
    except (E1, E2): 
    do_stuff_to_be_done_in_case_any_exception_occurred() 
相關問題