2012-06-27 38 views
2

嗨,有沒有辦法從異常被拋出的地方繼續? 例如,我有以下psudo代碼Python從異常被拋出的地方繼續運行

unique code 1 
unique code 2 
unique code 3 

,如果我想忽略任何獨特的代碼語句的例外,我將不得不做這樣的:

try: 
    #unique code 1 
except: 
    pass 

try: 
    #unique code 2 
except: 
    pass 

try: 
    #unique code 3 
except: 
    pass 

但這不是優雅的我,對我的生活我不記得我是如何解決這樣的最後一次問題......我想有是一樣的東西

try: 
    unique code 1 
    unique code 2 
    unique code 3 
except: 
    continue from last exception raised 

更新: 原因:我問這個問題的原因是上面的3行代碼共享相同類型的異常,可以說,從數組中提取信息,並且在這個特定場景中,我並不關心值的異常在數組中。

+2

使用捕獲所有異常的那樣無論如何,這不是一個好習慣。您應該捕獲更具體的異常類型。 – Keith

+0

@Keith我已添加原因,請參閱上文。 –

回答

2

總結各代碼段成一個函數,然後嘗試在for循環調用每個:

def code1(): 
    #unique code 1 

def code2(): 
    #unique code 2 

def code3(): 
    #unique code 3 

for section in [code1, code2, code3]: 
    try: 
     section() 
    except: 
     pass 

編輯:如果你還在尋找另一種方式,你可以使用一個裝飾,使每次通話「安全」購買返回任何錯誤,而不是拋出它們。不知道這是否真的是Python的還是一個偉大的方式做事情,但它是一種方法:

def safe_call(fn): 
    def wrapper(*args, **kwargs): 
     try: 
      return fn(*args, **kwargs) 
     except Exception as error: 
      return error 
    return wrapper 

@safe_call 
def code1(): 
    #unique code 1 

@safe_call 
def code2(): 
    #unique code 2 

@safe_call 
def code3(): 
    #unique code 3 

code1() 
code2() 
code3() 
+0

這是一個很好的解決方法,有沒有其他更規範的方法? –

0

我們可以用一個循環:

#!/urs/bin/env python 

check = 0 
while True: 
    try: 
     if check == 0: 
      #unique_code_one() 
      check += 1 
     if check == 1: 
      #unique_code_two() 
      check += 1 
     if check == 2: 
      #unique_code_three() 
    except: 
     check = 2 
+0

對不起,我沒有仔細閱讀你的問題。這是錯誤的答案 – hungnv