2015-05-14 31 views
2

我怎樣才能更好地用Python語言編寫下面的代碼片段:如何在Python中用冗餘代碼更好地編寫多個異常?

try: 
    statement-1 
except Exception1: 
    codeblock-1 
    codeblock-2 
except Exception2: 
    codeblock-2 

只是要清楚,我想執行兩個代碼塊,當第一異常發生,而當第二異常發生時只有這兩個代碼塊的後。

+3

爲什麼不能提取'代碼塊-2'到一個函數,並調用它? – jonrsharpe

回答

5

你有兩個選擇,因爲我看到它;要麼:

  1. 提取codeblock-2到一個函數,只是調用它(你只重複一行這種方式);或
  2. 在相同的except中捕獲兩個異常,然後通過檢查捕獲的異常的類型來適當地處理這兩種情況。

請注意,這些不是相互排斥的,如果與第一種方法結合使用,則第二種方法可能更具可讀性。後者的一個片段:

try: 
    statement-1 
except (Exception1, Exception2) as exc: 
    if isinstance(exc, Exception1): 
     codeblock-1 
    codeblock-2 

在行動:

>>> def test(x, y): 
    try: 
     return x/y 
    except (TypeError, ZeroDivisionError) as exc: 
     if isinstance(exc, TypeError): 
      print "We got a type error" 
     print "We got a type or zero division error" 


>>> test(1, 2.) 
0.5 
>>> test(1, 'foo') 
We got a type error 
We got a type or zero division error 
>>> test(1, 0) 
We got a type or zero division error 
+0

如果它不是codeblocks和只是oneliners?雖然感謝第二個選項! – Deepak

+0

@Deepak如果你只有一行每個案件,然後使用選項2,不要打擾提取功能。 – jonrsharpe

+0

我不同意,「block」和「oneliner」之間沒有區別。我們使用函數不保存_lines_。 –

1

我只想直截了當地使用本地功能:

def exception_reaction(): 
    codeblock2() 

try: 
    statement1() 
except Exception1: 
    codeblock1() 
    exception_reaction() 
except Exception2: 
    exception_reaction()