我的代碼,將得出一個例外,像這樣:在Python 2中處理異常中的錯誤?
try:
causeEitherError1orError2
except Error1:
handle Error1
cause Error2
except Error2:
handle Error2
嘗試動作A會導致要麼ERROR1或誤差2。處理Error1有時會導致Error2。如何處理Error1和Error2,當Error2可能由原始嘗試或錯誤1引起?
我的代碼,將得出一個例外,像這樣:在Python 2中處理異常中的錯誤?
try:
causeEitherError1orError2
except Error1:
handle Error1
cause Error2
except Error2:
handle Error2
嘗試動作A會導致要麼ERROR1或誤差2。處理Error1有時會導致Error2。如何處理Error1和Error2,當Error2可能由原始嘗試或錯誤1引起?
一般來說,這看起來像是一個複雜的設計,但你有能力捕捉一個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
請注意,如果您嘗試將'e'與_specific異常type_進行比較,'isinstance'是更好的選擇。 –
@ChristianDean是的,那太好了!謝謝。 –
我不認爲你的錯誤處理程序應該甚至會再次造成錯誤。這似乎是一個奇怪的設計。不過,你可以通過聲明一個正在處理每個錯誤的函數來解決這個問題,並且可能會自動迭代地調用它。但是這會造成一個巨大的問題:如果你正在調用你的函數,就會產生影像,導致錯誤類型1,處理它並且在錯誤2中產生。這種處理再次導致類型1錯誤,依此類推。由於沒有結束,你會得到堆棧溢出。
您可以爲函數添加某種錯誤級別的計數器給全局錯誤級別,這是通過在錯誤處理程序中引發錯誤而增加的。然後你可以添加某種限制,在這種限制下錯誤處理將被停止。
這似乎是一個奇怪的情況,但我能想象這樣的事情處理網絡請求時是必要的。你可以嘗試這樣的結構:
try:
causeEitherError1orError2
except (Error1, Error2) as e:
try:
handle e
except Error2 as q:
handle q
對不起,但這和我的回答完全一樣。 –
如果try: .. except Error1:
整個塊都可以提高Error2
那麼整個試除了應該在裏面的另一個嘗試:
try:
try:
causeEitherError1orError2
except Error1:
handle Error1
cause Error2
except Error2:
handle Error2
這樣兩個錯誤可以提高並正確抓住。
當你說你想「處理」一個錯誤時,你是什麼意思:(a)忽略錯誤並採取其他一些行動;或(b)採取其他行動,然後重新籌集?在你的示例僞代碼中,最後一行應該是「處理Error2」而不是「導致Error2」? – FMc
@FMc我想做(b)採取一些其他行動並重新加註。是的,我打算處理Error2不會再造成它! – yeswekhan