異常:因為程式出現了錯誤而在正常控制流以外採取的行為,行為階段: 觸發異常-檢測(採取措施)
常見異常:nameerror
zerodivisionerror
syntaxerror indexerror
keyerror
ioerror
attributeerror
try-except*-[else]
:一般用法, 若無異常進else
try-finally
:不用來捕獲異常, 用來維持一致性的行為(如file.close()
)
try-except*-[else]-finally
:無論是否有異常, 最後都會執行finally
配合用法:保證共享的資源的唯一分配, 並在任務結束的時候釋放它(如io、執行緒資源、資料庫連線)
如果異常發生後沒有找到合適的處理器, 則會不斷向上移交, 若到頂層仍未找到, 直譯器會顯示出跟蹤記錄(traceback
)並退出
乙個except
子句可以處理多個異常:要求異常被放在乙個元祖裡
非錯誤條件觸發的異常:systemexit
(python應用需要退出)keyboardinterupt
(使用者按了^c)
python2.5起, 異常遷移到新式類(之前是字串)後的異常基類:baseexception
, 而且上條兩個特殊錯誤被移至與exception同級避免把大片的**裝入try-except
中然後使用pass
忽略掉錯誤
每個異常都會生成自己的異常引數, 異常引數(exception, e:
中的e
)自身會組成乙個元祖並儲存為類例項的屬性, 引發異常時最好提供和相應的引數資訊如果finally
中引發了另乙個異常或有return
、break
、continue
語法而終止, 原異常將丟失而且無法重新引發with
(try-except-finally
的抽象化),只能工作於支援上下文管理協議的物件
with
和as
間的內容是上下文符號, 用它來獲得乙個上下文管理器去提供(自身也可以是)乙個上下文物件(通過__context__()
方法)
在獲得上下文物件後呼叫__enter__()
來完成with
語句塊執行前的準備工作, 若無宣告變數丟棄返回值
with
語句塊執行完無論結果如何都會呼叫物件的__exit__()
方法(三個引數:等於sys.exc_info()
返回的型別、值、跟蹤記錄)
用contextlib模組可以更方便使用上下文管理
字串做為異常很少使用並且快被廢棄,不能用
觸發異常raise[exceptionname(字串/類/例項)[,args(元祖/單元素元祖),traceback(新的, 便於重新引發異常)]]
當raise
無引數時引發的是當前**塊最近觸發的乙個異常(如果沒有, 會生成typeerror
)
斷言assert
(相當於raise-if
):如果斷言不成功, 觸發assertionerror
, 如果沒被異常捕捉,將終止程式執行並且提供追蹤記錄
可在判斷後新增異常引數(一般是字串)
p255標準異常集baseexception
->systemexit, keyboardinterrupt,exception(包含所有內建異常)
另一種獲取異常資訊的途徑是sys.exc_info()
:提供乙個三元組(類,類例項,跟蹤記錄)
Python隨學隨記(2) 數字 對映與集合
整型 布林型 只有兩個值的整型 標準整型 長整型 雙精度浮點型 佔8個位元組,帶小數點和e 科學計數法可選 複數長整型型別是標準整型型別的超集,能表達的數值與記憶體大小相關 遠大於其它語言的長整型 運算元自動轉換為同型別的內建函式 coerce 在python3中已棄 位操作符 只用於整型 取反 n...
6 錯誤與異常
程式有可能出現錯誤與異常 1.通過try,except處理。try 業務語法塊 except 異常型別 處理異常語法塊 2.丟擲異常 raise exception 3.finally子句 無論是否有異常或者是否捕捉異常,finally子句都會執行 4.自定義異常 自定義異常應該繼承exceptio...
Python隨學隨記(4) 條件和迴圈
語句 if else elif while for break continue pass懸掛else問題 在c中else與最近的if搭配,就會容易產生問題,而python中因為強制縮排,所以不會有這問題 elif常可以用序列和成員關係符進行簡化 更優雅 利用字典 使用對映物件的乙個最大好處是它的搜...