2013-06-26 30 views
21

我在try代碼塊中遇到了我的代碼問題。 爲了方便,這是我的代碼:在一個塊中的多個嘗試代碼

try: 
    code a 
    code b #if b fails, it should ignore, and go to c. 
    code C#if c fails, go to d 
    code d 
except: 
    pass 

是這樣的可能嗎?

+1

要明確,你想'代碼C'與代碼

例子可以投入功能僅當代碼b引發異常時才執行*? –

+0

所有代碼應該在一個try塊中運行,即使它們引發異常。 – arvidurs

+0

你不能那樣做。一個'try'模塊不能抑制執行的所有代碼中的異常。當它發生時,它會讓你捕捉異常,但塊的其餘部分永遠不會被執行。 –

回答

30

你必須讓這個單獨try塊:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    try: 
     code c 
    except ExplicitException: 
     try: 
      code d 
     except ExplicitException: 
      pass 

這是假定你想運行code c只有如果code b失敗。

如果你需要運行code c無論,你需要把對方後try塊一個:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    pass 

try: 
    code c 
except ExplicitException: 
    pass 

try: 
    code d 
except ExplicitException: 
    pass 

我使用except ExplicitException在這裏,因爲它是從未一個很好的做法,一味忽略所有例外。您會忽略MemoryError,KeyboardInterruptSystemExit,否則,您通常不會忽略或攔截,而沒有某種重新提升或有意識的理由來處理這些問題。

+0

Python的異常處理非常難看,它使您可以編寫針對C風格宏指令的代碼。 – Elazar

+3

@Elazar:當你的代碼看起來像上面那樣,你真的想重新思考你在做什麼。通過上下文管理器和一些重構,大多數異常處理代碼可以變得更具可讀性和可維護性。 –

+0

問題是,我應該重新考慮它是因爲它是python,所以我必須使用異常和縮進。四個簡單的操作,每個只應在最後一次失敗時執行,並且您可以獲得4級縮進。呃。如果例外是好的,它們的使用應該在語法上受到鼓勵。 – Elazar

3

提取(重構)您的語句。並使用andor的魔法來決定何時短路。

def a(): 
    try: # a code 
    except: pass # or raise 
    else: return True 

def b(): 
    try: # b code 
    except: pass # or raise 
    else: return True 

def c(): 
    try: # c code 
    except: pass # or raise 
    else: return True 

def d(): 
    try: # d code 
    except: pass # or raise 
    else: return True 

def main(): 
    try: 
     a() and b() or c() or d() 
    except: 
     pass 
+1

'除了:提高'?那有什麼意義?異常仍然會取消其餘的通話。 –

+0

這是評論,取決於他是否希望它繼續或停止。 –

+1

我認爲裝飾者會適合這裏。 – Elazar

1

如果你不想鏈(一個巨大的數字)嘗試 - 除了條款,您可以嘗試在一個循環的代碼,並在第一次成功突破。直接在當前範圍

for code in (
    lambda: a/b, 
    lambda: a/(b + 1), 
    lambda: a/(b + 2), 
    ): 
    try: print(code()) 
    except Exception as ev: continue 
    break 
else: 
    print("it failed: %s" % ev) 

例任意代碼(報表):

for i in 2, 1, 0: 
    try: 
     if i == 2: print(a/b) 
     elif i == 1: print(a/(b + 1)) 
     elif i == 0: print(a/(b + 2)) 
     break   
    except Exception as ev: 
     if i: 
      continue 
     print("it failed: %s" % ev)