Python程序开发——第九章 异常处理
目錄
- 一、異常
- 二、捕獲異常
- (一)try...except語句
- 1、單個異常
- 2、多個異常
- 3、省略異常類
- (二)try...except...else語句
- (三)try...except...finally語句
- 三、拋出異常
- (一)raise語句
- 1、異常類型拋出異常
- 2、異常對象拋出異常
- 3、由異常拋出異常
- (二)assert斷言語句
- 四、自定義異常
一、異常
python中的異常都是通過類實現(xiàn)的,所有的異常類都是繼承自基類BaseException,可分為四類如下:
若程序中的異常沒有被處理,則默認情況下該異常會被傳遞給上一級,這就是異常的傳遞,若上一級仍未處理,則會繼續(xù)向上傳遞直至異常被處理或程序崩潰。
二、捕獲異常
(一)try…except語句
該語句用于捕獲程序運行時時的異常,其中try子句后面跟代碼,except子句后跟捕獲的異常類型以及當捕獲到異常后的處理代碼。簡單的來說,當try子句中若有異常,則忽略該子句中的剩余代碼,立即執(zhí)行except子句中的代碼,而當try子句沒有異常則不執(zhí)行except子句后的內(nèi)容。
try:代碼 except(異常類型):異常處理代碼python中標準異常有以下:python標準異常
例如下列python代碼,這里try子句中由于未聲明d變量,使產(chǎn)生NameError:未聲明/初始化對象 (沒有屬性)的異常,except子句中檢測到異常從而執(zhí)行正確的代碼:
運行結(jié)果如下:
1、單個異常
可以通過在異常類型后跟as e/error 的形式來用于記錄具體的異常類型,其中e/error獲取異常信息。
例如下列python代碼:
運行結(jié)果如下,其中的name ‘d’ is not defined就是所記錄的異常信息:
2、多個異常
可能代碼中有多個異常,可通過將異常類一并放在except子句后或使用多個except子句。
例如下列python代碼,這里except (TypeError, NameError) as error的含義是當程序中有對類型無效的操作(TypeError)或未聲明/初始化對象(NameError)時輸出異常信息:
運行結(jié)果如下:
也可以分開寫多個except子句,即當程序中有不同的異常時執(zhí)行哪個子句。
例如下列python代碼,程序中有對類型無效的操作時通過input()函數(shù)接收一個標準輸入數(shù)據(jù)c并輸出該數(shù)據(jù),而當程序中有未聲明/初始化對象的異常時輸出記錄的異常信息:
運行結(jié)果如下,由于未聲明變量c:
3、省略異常類
省略異常類即省略except子句后的異常類型,表明處理所有捕獲到的程序異常。
例如下列python代碼:
運行結(jié)果如下:
(二)try…except…else語句
在try…except語句后加一個else子句,該子句的內(nèi)容即當try子句沒有發(fā)生任何異常時執(zhí)行的代碼。
例如下列python代碼,當程序有未聲明/初始化對象的異常情況時輸出提示,若無異常則輸出a-b的值:
運行結(jié)果如下:
(三)try…except…finally語句
try…except語句與finally子句一起運用時,表示無論是否捕獲到異常,finally子句內(nèi)的代碼都要執(zhí)行,比如在處理文件時就要用到finally子句,即用于關閉文件從而避免占用資源。
例如下列python代碼,這里finally子句中不管是否有異常,該子句內(nèi)的文件關閉file.close()都要執(zhí)行:
運行結(jié)果如下:
也可以通過with語句來釋放文件,執(zhí)行語句后with語句會關閉文件,若文件不能打開則也會關閉文件,格式如下:
這里的上下文表達式返回一個上下文資源器對象,若指定了as子句,則將上下文資源管理器對象的__enter__()方法的返回值賦值給資源對象,另外要注意不是所有對象都可以使用with語句,只有支持上下文管理協(xié)議的對象才可以使用該語句。
三、拋出異常
捕獲異常可以理解為程序有異常系統(tǒng)報錯,另外我們可以通過相關的語句來使異常主動拋出。
(一)raise語句
1、異常類型拋出異常
在raise語句后跟異常類型,即可以通過使用異常類型的名稱從而拋出異常。
例如下列python代碼,通過使用raise語句拋出OverflowError異常,該異常類型表示數(shù)值運算超出最大限制:
運行結(jié)果如下:
2、異常對象拋出異常
例如下列python代碼,創(chuàng)建了一個OverflowError類的obj_error對象并通過raise語句拋出對象:
obj_error = OverflowError() raise obj_error運行結(jié)果如下:
3、由異常拋出異常
通過單用raise關鍵字可以重新拋出發(fā)生的異常。
例如下列python代碼:
運行結(jié)果如下:
(二)assert斷言語句
assert斷言語句用于判斷一個表達式是否為真,若為假則拋出AssertionError異常,格式如下,其中表達式是判斷的對象,參數(shù)通常是一個自定義的描述異常具體信息的字符串:
assert 表達式[,參數(shù)]例如下列python代碼,1<-1表達式為假所以程序拋出AssertionError異常:
a = 1 b = -1 assert a < b運行結(jié)果如下:
四、自定義異常
雖然python中定義了很多的異常類型,但我們也可以自定義異常,即通過創(chuàng)建一個類,讓其繼承Exception類或其它類。
例如下列python代碼,首先自定義異常my_error類,在其類的構(gòu)造方法中調(diào)用基類Exception的__init__方法并將異常信息作為參數(shù)
運行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的Python程序开发——第九章 异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python程序开发——第八章 文件
- 下一篇: Python程序开发——第十章 正则表达