Python例外處理try except else finally

2020-07-16 10:05:25
例外處理是程式語言或計算機硬體裡的一種機制,用於處理軟體或資訊系統中出現的超出程式正常執行流程的異常狀況。異常(Exception)這一術語所描述的通常是一種資料結構,可以儲存與某種異常狀況相關的資訊。

丟擲是用來移交控制權的機制,丟擲異常也可以稱作引發異常。丟擲異常後,控制權會查詢對應的捕獲機制並做進一步處理。錯誤(Error)則常用來表示系統級錯誤或底層資源錯誤。在 Python 中,二者具有相同的處理機制。程式設計過程中,通常很難將所有的異常狀況都處理得很好,通過異常捕獲可以針對突發事件做集中處理,從而保證程式的穩定性和健壯性。

在 Python 中使用 try…except…else…finally… 語句檢查可能發生異常的程式碼、捕獲異常並做進一步處理,其語法如下:

try:
#嘗試執行的程式碼
[except 錯誤型別1 :
#針對錯誤型別1,對應的程式碼處理]
[except 錯誤型別2 :
#針對錯誤型別2,對應的程式碼處理]
[except (錯誤型別3,錯誤型別4):
#針對錯誤型別3和4,對應的程式碼處理]
[except Exception as result:
#列印錯誤資訊]
[else:
#沒有異常才會執行的程式碼]
[finally:
#無論是否有異常,都會執行的程式碼]


例如以下程式碼嘗試執行除法操作:
try:
    num = int(input("請輸入一個整數: "))
    result = 5 / num
    print(result)
except ValueError:
    print("請輸入正確的整數")
except ZeroDivisionError:
    print("除 0 錯誤")
except Exception as result:
    print("未知錯誤 %s" % result)
else :
    print("正常執行")
finally:
    print("執行完成")
當使用者輸入 0 時,上述程式碼的執行結果如下所示:

>>> try:
...       num = int(input("請輸入一個整數: "))
...       result = 5 / num
...       print(result)
...   except ValueError:
...        print("請輸入正確的整數")
...   except ZeroDivisionError:
...        print("除 0 錯誤")
...   except Exception as result:
...        print("未知錯誤 %s" % result)
...   else :
...        print("正常執行")
...   finally:
...        print("執行完成")
   
請輸入一個整數: 0
除 0 錯誤
執行完成


當使用者輸入字母 a 時,上述程式碼的執行結果如下所示:

>>> try:
...       num = int(input("請輸入一個整數: "))
...       result = 5 / num
...       print(result)
...   except ValueError:
...        print("請輸入正確的整數")
...   except ZeroDivisionError:
...        print("除 0 錯誤")
...   except Exception as result:
...        print("未知錯誤 %s" % result)
...   else :
...        print("正常執行")
...   finally:
...        print("執行完成")
   
請輸入一個整數: a
請輸入正確的整數
執行完成


可以看到,程式根據使用者的不同輸入執行了不同的例外處理分支程式碼塊,並在最後執行了 finally 程式碼塊。通常來說,當函數或方法執行出現異常時,異常將被傳遞給函數或方法的呼叫方,若逐級傳遞到主程式,仍然沒有對應的例外處理程式碼塊,程式才會最終被終止。因此可以在主函數中適當增加異常捕獲程式碼。

除了程式碼執行自動丟擲異常外,程式設計者還可以根據程式業務功能需求,人為地丟擲異常,這種情況下可以使用 raise 語句,例如:
try:
     raise Exception
except Exception:
    print("This is an Exception")
上述程式碼的執行結果如下所示:

>>> try:
...          raise Exception
...      except Exception:
...          print("This is an Exception")

This is an Exception