2017-09-04 46 views
1

我的代碼,將得出一個例外,像這樣:在Python 2中處理異常中的錯誤?

try: 
    causeEitherError1orError2 
except Error1: 
    handle Error1 
    cause Error2 
except Error2: 
    handle Error2 

嘗試動作A會導致要麼ERROR1或誤差2。處理Error1有時會導致Error2。如何處理Error1和Error2,當Error2可能由原始嘗試或錯誤1引起?

+0

當你說你想「處理」一個錯誤時,你是什麼意思:(a)忽略錯誤並採取其他一些行動;或(b)採取其他行動,然後重新籌集?在你的示例僞代碼中,最後一行應該是「處理Error2」而不是「導致Error2」? – FMc

+0

@FMc我想做(b)採取一些其他行動並重新加註。是的,我打算處理Error2不會再造成它! – yeswekhan

回答

2

一般來說,這看起來像是一個複雜的設計,但你有能力捕捉一個except括號的多個例外。您還可以嵌套try-except處理程序,以利於您。一個可能的設計是:

如果你想辨別什麼Exception引發的第一次,你可以隨時查詢類型:

print(type(e)) # prints Error1 or Error2 depending on what was raised 

,或者更準確的說,它縮小與isinstance檢查:

if isinstance(e, Error1): 
    ... # handle e as Error1 
else: 
    ... # handle e as Error2 
+1

請注意,如果您嘗試將'e'與_specific異常type_進行比較,'isinstance'是更好的選擇。 –

+0

@ChristianDean是的,那太好了!謝謝。 –

2

我不認爲你的錯誤處理程序應該甚至會再次造成錯誤。這似乎是一個奇怪的設計。不過,你可以通過聲明一個正在處理每個錯誤的函數來解決這個問題,並且可能會自動迭代地調用它。但是這會造成一個巨大的問題:如果你正在調用你的函數,就會產生影像,導致錯誤類型1,處理它並且在錯誤2中產生。這種處理再次導致類型1錯誤,依此類推。由於沒有結束,你會得到堆棧溢出。

您可以爲函數添加某種錯誤級別的計數器給全局錯誤級別,這是通過在錯誤處理程序中引發錯誤而增加的。然後你可以添加某種限制,在這種限制下錯誤處理將被停止。

-1

這似乎是一個奇怪的情況,但我能想象這樣的事情處理網絡請求時是必要的。你可以嘗試這樣的結構:

try: 
    causeEitherError1orError2 
except (Error1, Error2) as e: 
    try: 
     handle e 
    except Error2 as q: 
     handle q 
+1

對不起,但這和我的回答完全一樣。 –

1

如果try: .. except Error1:整個塊都可以提高Error2那麼整個試除了應該在裏面的另一個嘗試:

try: 
    try: 
     causeEitherError1orError2 
    except Error1: 
     handle Error1 
     cause Error2 
except Error2: 
    handle Error2 

這樣兩個錯誤可以提高並正確抓住。