Python例外處理機制的底層實現

2020-07-16 10:05:17
前面章節中,我們詳細介紹了try except例外處理的用法,簡單來說,當位於 try 塊中的程式執行出現異常時,會將該種異常捕獲,同時找到對應的 except 塊處理該異常,那麼這裡就有一個問題,它是如何找到對應的 except 塊的呢?

我們知道,一個 try 塊也可以對應多個 except 塊,一個 except 塊可以同時處理多種異常。如果我們想使用一個 except 塊處理所有異常,就可以這樣寫:
try:
    #...
except Exception:
    #...
這種情況下,對於 try 塊中可能出現的任何異常,Python 直譯器都會交給僅有的這個 except 塊處理,因為它的引數是 Exception,表示可以接收任何型別的異常。

注意,對於可以接收任何異常的 except 來說,其後可以跟 Exception,也可以不跟任何引數,但表示的含義都是一樣的。

這裡就要詳細介紹一下 Exception。要知道,為了表示程式中可能出現的各種異常,Python 提供了大量的異常類,這些異常類之間有嚴格的繼承關係,圖 1 顯示了 Python 的常見異常類之間的繼承關係。

Python 的常見異常類之間的繼承關係
圖 1 Python 的常見異常類之間的繼承關係