Python程式設計思想(33) 異常類與多異常捕獲

2021-10-07 19:25:34 字數 2773 閱讀 5333

《python程式設計思想》總目錄

《python程式設計思想》專欄

當 python直譯器接收到異常物件時,如何為該異常物件尋找 except塊呢?注意到前面的**中的except塊,這個塊是專門用於處理該異常類及其子類的異常例項。

當 python直譯器接收到異常物件後,會依次判斷該異常物件是否是 except塊後的異常類或其子類的例項,如果是, python直譯器將呼叫該 except塊來處理該異常;否則,再次拿該異常物件和下乙個 except塊裡的異常類進行比較。 python異常捕獲的流程如下:

try

statement1

statement2  # 丟擲異常,產生乙個error物件,需要exception2進行處理

... ...

# 後面的語句將不再執行      

except exception1:  # error會與exception1比較

# 處理exception1

# 不再執行其他處理異常的塊 

...except exception2:  # error會與exception2比較,該塊可以處理statement2丟擲的error物件

# 處理exception2

# 不再執行其他處理異常的塊 

...

從上面的流程可以看出,在try塊後可以有多個 except塊,這是為了針對不同的異常類提供不同的異常處理方式。當程式發生不同的意外情況時,系統會生成不同的異常物件, python直譯器就會根據該異常物件所屬的異常類來決定使用哪個 except塊來處理該異常。

通過在try塊後提供多個 except塊可以無須在異常處理塊中使用if判斷異常型別,但依然可以針對不同的異常型別提供相應的處理邏輯,從而提供更細緻、更有條理的異常處理邏輯。

在通常情況下,如果try塊被執行一次,則try塊後只有乙個 except塊會被執行,不可能有多個 except塊被執行。除非在迴圈中使用了 continue開始下一次迴圈,下次迴圈又重新執行了try塊,這才可能導致多個 except塊被執行。

python的所有異常類都從 baseexception類派生而來,提供了豐富的異常類,這些異常類之間有嚴格的繼承關係,下圖顯示了 python的常見異常類之間的繼承關係。

從這張圖中可以看出, python的所有異常類的基類是 base exception,但如果使用者要實現自定義異常,則不應該繼承這個基類,而應該從 exception類繼承。

baseexception的主要子類就是 exception,不管是系統的異常類,還是使用者自定義的異常類,都應該從 exception類派生。下面看乙個簡單的異常捕獲的例子:

示例**:div_demo. py

import sys

try:

a = int(sys.ar**[1])

b = int(sys.ar**[2])

c = a / b

print("您輸入的兩個數相除的結果是:", c )

except indexerror:

print("索引錯誤:執行程式時輸入的引數個數不夠")

except valueerror:

print("數值錯誤:程式只能接收整數引數")

except arithmeticerror:

print("算術錯誤")

except exception:

print("未知異常")

這段**匯入了sys模組,並通過sys模組的ar**列表來獲取執行 python程式時提供的引數(命令列引數)。其中 sys.ar**[0]通常代表正在執行的 python程式名,sys. ar**[1]代表執行程式所提供的第1個引數,sys.ar**[2]代表執行程式所提供的第2個引數……依此類推。

這段**針對 indexerror、 valueerror、 arithmeticerror型別的異常,提供了專門的異常處理邏輯。該程式執行時的異常處理邏輯可能有如下幾種情形:

上面程式中的3種異常,都是非常常見的執行時異常,讀者應該記住這些異常,並掌握在哪些情況下可能出現這些異常。

python的乙個 except塊可以捕獲多種型別的異常。在使用乙個 except塊捕獲多種型別的異常時,只要將多個異常類用圓括號括起來,中間用逗號隔開即可。

下面演示了 python的多異常捕獲:

示例**:multi_exception_demo.py

import sys

try:

a = int(sys.ar**[1])

b = int(sys.ar**[2])

c = a / b

print("您輸入的兩個數相除的結果是:", c )

except (indexerror, valueerror, arithmeticerror):

print("程式發生了陣列越界、數字格式異常、算術異常之一")

except:

print("未知異常")

在這段程式中使用了 (indexerror, valueerror, arithmeticerror)來指定所捕獲的異常型別,這就表明該 except塊可以同時捕獲這3種型別的異常。

python異常類 python 異常型別

1 nameerror 嘗試訪問乙個未申明的變數 v nameerror name v is not defined 2 zerodivisionerror 除數為0 v 1 0 zerodivisionerror int division or modulo by zero 3 syntaxerr...

java程式設計思想 復用類

1.組合 在類中引用新類 2.繼承 判斷是否使用繼承 需要向上轉型的時候 在繼承後引用構造子類時,會先呼叫基類的構造器,如果基類無構造器,則會為你合成乙個預設構造器 繼承中的覆蓋 重寫 3.package chapter7 使用 public class ster public void steri...

C 程式設計思想 卷二 異常處理

關鍵字throw將導致一系列事情的發生 首先,它將建立程式所丟擲的物件的乙個拷貝。然後,包含throw表示式的函式返回了這個物件,即使該函式原先並未設計為返回這種物件型別。另外,異常發生之前建立的區域性物件被銷毀 呼叫物件的析構函式 乙個異常被丟擲以後,異常處理系統將按照在源 中出現的順序查詢最近的...