python學習筆記 異常處理

2021-07-04 02:42:44 字數 4144 閱讀 4577

try/多個except/else/finally語句

try**塊是此語句的主要動作,嘗試執行的**。except分句捕獲且處理try**塊內引發的異常,else分句是try沒有發生異常時要執行的處理器。finally語句不管異常是否發生都會去執行的,如果沒有異常發生,執行完try**塊後執行finally語句,否則執行完異常處理之後跳去執行finally語句。

try:

try-block

except exception1:

handler1

except exception2:

handler2

...except:

handler

else:

else-block

finally:

finally-block

# 一般常用形式try...except...finally

# 注意:finally一但有異常發生,就會觸發finally語句執行,小心謹慎使用。一般在最外層使用,用於程式異常結束關閉檔案,資料庫連線,套接字連線等。

try:

print

'outer try'

try:

print

'inner try'

temp = 1 + # unsupported operand type(s) for +: 'int' and 'list'

except typeerror as e:

print e

finally:

print

'inner finally'

finally:

print

'outer finally'

# 輸出:

'''outer try

inter try

unsupported operand type(s) for +: 'int' and 'list'

inner finally

outer finally

'''

如果try**塊執行時發生了異常,python會去執行第乙個符合引發異常的except分句下面的處理**。如果沒有找到符合的except分句,異常就會傳遞到當前try語句外部,由外部的except處理。當except語句執行完後,假設except語句執行過程中無異常發生,控制權就會跳到try語句後繼續執行。如果有finally語句自動觸發執行。

如果try**塊執行無異常發生,python會去執行else分句**塊,執行完後控制權會跳到try語句後繼續執行。

使用except可以捕獲所有異常,如異常巢狀結構中高層try處理器所期待發生的異常錯誤,這類錯誤包括記憶體錯誤,迴圈迭代結束等。

利用sys.exc_info可以獲取最近發生的異常的結果,以三元組的形式返回(type,value,traceback)。type是正在處理的異常的異常型別,value是異常引數,traceback是乙個traceback物件,代表異常最初發生時所呼叫的堆疊。

except常用形式

分句形式

說明except:

捕捉所有(其他)異常型別

except name:

只捕捉特定的異常

except name,value:

捕獲特定異常和其額外資料

except (name1,name2):

捕捉任何列出的異常

except (name1,name2),value:

捕捉任何列出的異常,並取得其額外資料

else:

如果沒有引發異常,就執行

finally:

總是會執行此**塊,無論是否發生異常

except:

用在想不到異常情況,在except:前面可以定義可以想到的異常:except name1: except name2:

有時候我們需要在自己實現的介面裡丟擲異常,這時候我們就要用到raise關鍵字了,後面跟著要引發的異常類名稱,以及乙個可選的額外資料項。異常不總是錯誤,但錯誤一定是異常。我們有時候需要在無法返回警示值的函式中主動丟擲非錯誤異常。

class

undefineerror

(exception):

def__init__

(self, data)

self.data = data

def__str__

(self):

# 過載

return

"undefineerror: can't find the item."

defget_item

():# 獲取乙個資料庫條目

if success: # 成功找到,返回條目

return item

else: # 查詢失敗,拋出自定義異常

raise undefineerror()

# 最常用丟擲異常方式

raise class_instance # raise undefineerror('data')

class_instance異常類名稱需要預先定義好,否則會報未定義錯誤。

我們可以在丟擲異常的時候攜帶資料資訊,在try語句中,捕獲這個資料是通過乙個變數實現的except class_instance, e,資料就存放在e變數中。

assert可以有條件地在程式**中觸發異常,可以認為是有條件的raise。assert幾乎都是用來檢驗使用者定義的約束條件,一般是用於檢查介面引數合法性,通常沒有必要寫assert去捕捉超出索引值,型別不匹配以及除數為0之類的事。

assert

deftest

(x):

assert x > 0, 'x must great than zero.'

return x * x

test(-1) # assertionerror: x must be great zerot

type

說明nameerror

通常出現在訪問乙個未宣告變數時

syntaxerror

這個最常見,語法錯誤

indexerror

索引越界錯誤

ioerror

io(輸入/輸出) 錯誤 通常出現在 開啟或者對乙個不存在的檔案進行操作時

keyerror

請求乙個不存在的字典鍵值

attributeerror

嘗試訪問函式或者類的未知物件屬性時會出現此類錯誤

typeerror

型別錯誤

overflowerror

記憶體溢位

importerror

當import語句無法找到對應的模組定義或from…import無法找到對應名字的內容時觸發此異常

eoferror

當內建函式(input() 或 raw_input())達到檔案尾時觸發此異常

assertionerror

當判定條件失敗時,觸發此異常

environmenterror

所有能發生在python系統之外的異常的基類:ioerror, oserror

arithmeticerror

一些內建算術錯誤異常的基類,如:overflowerror, zerodivisionerror,floatingpointerror

standarderror

所有內建異常的基礎類,除了stopiteration,generatorexit, keyboardinterrupt和systemexit。standarderror 是繼承exception而來的

runtimeerror

當乙個無法分類的錯誤發生時,觸發該異常

systemerror

當解釋程式遇到乙個內部錯誤,但是情況看來可以糾正,不需要放棄退出

systemexit

這個異常被 sys.exit() 函式觸發。當這個異常沒有被有效處理,python終止程式並退出;沒有堆疊資訊列印。如果輔助引數是整數,它表示系統退出狀態(和c語言的exit()函式類似);如果它是空則退出狀態為0;如果它是其它型別(例如字串),這個物件會被列印輸出,並且退出狀態為1

valueerror

當乙個內建操作或函式接收了引數,引數的型別是對的但值並不符合並且無法匹配乙個更加精準的異常(例如:indexerror),觸發此異常

python學習筆記 異常處理

什麼是異常 異常就是程式執行時發生錯誤的訊號 在程式出現錯誤時,則會產生乙個異常,若程式沒有處理它,則會 丟擲該異常,程式的執行也隨之終止 語法錯誤 不按照語言基準來寫 print hello 邏輯錯誤 res 1 0 zerodivisionerror l 1.2 l 10 indexerror ...

python學習筆記 異常處理

assertionerror 斷言語句失敗 attributeerror 嘗試訪問未知的物件屬性 indexerror 索引超出序列的範圍 keyerror 字典中查詢乙個不存在的關鍵字 nameerror 嘗試訪問乙個不存在的變數 oserror 作業系統產生的異常 syntaxerror pyt...

python學習筆記 異常處理

attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x ioerror 輸入 輸出異常 基本上是無法開啟檔案 importerror 無法引入模組或包 基本上是路徑問題或名稱錯誤 indentationerror 語法錯誤 的子類 沒有正確對齊 indexer...