Python隨學隨記(6) 錯誤與異常處理

2021-07-16 02:16:09 字數 2425 閱讀 8921

異常:因為程式出現了錯誤而在正常控制流以外採取的行為,行為階段: 觸發異常-檢測(採取措施)

常見異常:nameerrorzerodivisionerrorsyntaxerror indexerror

keyerrorioerrorattributeerrortry-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中引發了另乙個異常或有returnbreakcontinue語法而終止, 原異常將丟失而且無法重新引發with(try-except-finally的抽象化),只能工作於支援上下文管理協議的物件

withas間的內容是上下文符號, 用它來獲得乙個上下文管理器去提供(自身也可以是)乙個上下文物件(通過__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常可以用序列和成員關係符進行簡化 更優雅 利用字典 使用對映物件的乙個最大好處是它的搜...