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