




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章錯(cuò)誤和異?!禤ython程序開(kāi)發(fā)案例教程(第2版))》學(xué)習(xí)目標(biāo)/Target了解錯(cuò)誤和異常,能夠說(shuō)出什么是錯(cuò)誤和異常熟悉異常的類(lèi)型,能夠理解常見(jiàn)異常類(lèi)的含義掌握try-except語(yǔ)句的使用,能夠在程序中通過(guò)try-except語(yǔ)句捕獲與處理異常掌握try-except-else語(yǔ)句的使用,能夠通過(guò)try-except-else語(yǔ)句捕獲異常,并在else子句中添加沒(méi)有異常的處理代碼掌握try-except-finally語(yǔ)句的使用,能夠通過(guò)try-except-finally語(yǔ)句捕獲異常,并在finally子句中添加釋放資源的代碼學(xué)習(xí)目標(biāo)/Target掌握raise語(yǔ)句的使用,能夠在程序中通過(guò)raise語(yǔ)句拋出異常了解異常的傳遞,能夠說(shuō)出異常傳遞的特點(diǎn)掌握assert斷言語(yǔ)句的使用,能夠在程序中通過(guò)assert語(yǔ)句拋出異常掌握自定義異常的方法,能夠在程序中自定義并處理異常熟悉with語(yǔ)句與上下文管理器,能夠在程序中使用with語(yǔ)句釋放資源章節(jié)概述/Summary在現(xiàn)實(shí)生活中,我們經(jīng)常會(huì)遇到各種突發(fā)情況,比如航班延誤、火車(chē)晚點(diǎn)、交通堵塞等。而在程序中同樣不可避免地會(huì)出現(xiàn)異常,比如試圖打開(kāi)一個(gè)不存在的文件、訪(fǎng)問(wèn)未定義的變量等,這些異常默認(rèn)情況下都會(huì)導(dǎo)致程序崩潰而無(wú)法正常執(zhí)行。為了增強(qiáng)程序的穩(wěn)定性,Python提供了強(qiáng)大的異常處理機(jī)制,它不僅可以捕獲以及處理異常,防止程序崩潰,還提供詳細(xì)的診斷信息,幫助開(kāi)發(fā)人員快速定位和解決問(wèn)題。接下來(lái),本章將針對(duì)錯(cuò)誤和異常的內(nèi)容進(jìn)行講解。目錄/Contents010203錯(cuò)誤和異常概述捕獲與處理異常拋出異常目錄/Contents040506自定義異常with語(yǔ)句實(shí)例:身份歸屬地查詢(xún)錯(cuò)誤和異常概述10.1
先定一個(gè)小目標(biāo)!了解錯(cuò)誤和異常,能夠說(shuō)出什么是錯(cuò)誤和異常10.1.1認(rèn)識(shí)錯(cuò)誤和異常1.語(yǔ)法錯(cuò)誤10.1.1認(rèn)識(shí)錯(cuò)誤和異常語(yǔ)法錯(cuò)誤又稱(chēng)解析錯(cuò)誤,是指違反了Python語(yǔ)法規(guī)則的代碼所引起的錯(cuò)誤,通常是由開(kāi)發(fā)人員在編寫(xiě)代碼時(shí)造成的。語(yǔ)法錯(cuò)誤在被解釋器執(zhí)行之前就能由代碼編輯器檢測(cè)出來(lái),需要開(kāi)發(fā)人員修復(fù)以保證代碼的正確性。2.邏輯錯(cuò)誤10.1.1認(rèn)識(shí)錯(cuò)誤和異常邏輯錯(cuò)誤是指代碼在語(yǔ)法上是正確的,但邏輯上存在問(wèn)題,導(dǎo)致程序無(wú)法按照預(yù)期的方式執(zhí)行。邏輯錯(cuò)誤可能由錯(cuò)誤的算法、錯(cuò)誤的條件判斷或錯(cuò)誤的數(shù)據(jù)處理等引起。whileTrueprint("語(yǔ)法格式錯(cuò)誤")解析錯(cuò)誤示例循環(huán)條件的后面缺少冒號(hào)radius=5area=2*3.14*radius#錯(cuò)誤的公式print("圓的面積:",area)異常示例2πr是計(jì)算圓的周長(zhǎng),不是計(jì)算圓的面積10.1.1認(rèn)識(shí)錯(cuò)誤和異常示例演示3.異常10.1.1認(rèn)識(shí)錯(cuò)誤和異常異常是在程序運(yùn)行時(shí)期間發(fā)生的錯(cuò)誤,可能是由于外部環(huán)境、不正確的輸入、無(wú)效的操作或其他因素引起的。與錯(cuò)誤不同,異常通常是由解釋器在程序執(zhí)行期間檢測(cè)到的,并在處理異常的機(jī)制下進(jìn)行處理。注意,如果異常沒(méi)有被程序進(jìn)行處理,程序默認(rèn)的處理方式是直接終止運(yùn)行并給出錯(cuò)誤信息。File"D:\ProgramDev2\Chapter10\test.py",line1whileTrue^SyntaxError:expected':'示例
先定一個(gè)小目標(biāo)!熟悉異常的類(lèi)型,能夠理解常見(jiàn)異常類(lèi)的含義10.1.2異常的類(lèi)型Python中所有的異常均由類(lèi)實(shí)現(xiàn),所有的異常類(lèi)又繼承自BaseException類(lèi),程序運(yùn)行時(shí)出現(xiàn)的異常大多繼承自Exception類(lèi)。異常的類(lèi)型10.1.2異常的類(lèi)型解釋器退出異常中斷執(zhí)行時(shí)產(chǎn)生的異常內(nèi)置異常的基類(lèi)生成器退出異常Exception類(lèi)派生了很多子類(lèi),每個(gè)子類(lèi)都是開(kāi)發(fā)中經(jīng)常遇到的異常。Exception的常見(jiàn)子類(lèi)及其描述如表所示。異常的類(lèi)型10.1.2異常的類(lèi)型類(lèi)名描述SyntaxError當(dāng)程序中有語(yǔ)法錯(cuò)誤時(shí)引發(fā)的異常FileNotFoundError當(dāng)程序未找到指定文件或目錄時(shí)引發(fā)的異常NameError當(dāng)程序找不到指定名稱(chēng)的變量時(shí)引發(fā)的異常ZeroDivisionError當(dāng)程序中使用的除數(shù)為0時(shí)引發(fā)的異常IndexError當(dāng)程序中使用了超出序列范圍的索引時(shí)引發(fā)的異常KeyError當(dāng)程序中使用不存在的鍵訪(fǎng)問(wèn)字典時(shí)引發(fā)的異常AttributeError當(dāng)程序嘗試訪(fǎng)問(wèn)對(duì)象的未知屬性時(shí)引發(fā)的異常TypeError當(dāng)程序在使用某類(lèi)型的場(chǎng)合使用其他類(lèi)型時(shí)引發(fā)的異常捕獲與處理異常10.2
先定一個(gè)小目標(biāo)!掌握try-except語(yǔ)句的使用,能夠在程序中通過(guò)try-except語(yǔ)句捕獲與處理異常10.2.1try-except語(yǔ)句try-except語(yǔ)句10.2.1try-except語(yǔ)句try:
可能出錯(cuò)的代碼except[異常類(lèi)[as異常信息]]:
捕獲異常后的處理代碼語(yǔ)法格式執(zhí)行過(guò)程執(zhí)行try子句中可能出錯(cuò)的代碼若try子句中沒(méi)有產(chǎn)生異常,跳過(guò)except子句的代碼若產(chǎn)生異常,跳過(guò)try子句中出錯(cuò)行及之后的代碼,執(zhí)行except子句的代碼321txt_file.txt文件的內(nèi)容try-except語(yǔ)句10.2.1try-except語(yǔ)句(1)捕獲單個(gè)異常當(dāng)使用try-except語(yǔ)句捕獲異常時(shí),如果except后面指定一個(gè)異常類(lèi),那么此時(shí)程序只會(huì)捕獲與異常類(lèi)對(duì)應(yīng)的單個(gè)異常。try:foriin2:print(i)exceptTypeError:
#except后面指定一個(gè)異常類(lèi)print("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語(yǔ)句10.2.1try-except語(yǔ)句(2)捕獲多個(gè)異常一段代碼運(yùn)行后可能會(huì)產(chǎn)生多個(gè)異常。當(dāng)使用try-except語(yǔ)句捕獲異常時(shí),如果except后面指定包含多個(gè)異常類(lèi)的元組,那么此時(shí)程序會(huì)捕獲與異常類(lèi)對(duì)應(yīng)的多個(gè)異常。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])except(NameError,IndexError):#except后面指定多個(gè)異常類(lèi)print("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語(yǔ)句10.2.1try-except語(yǔ)句(2)捕獲多個(gè)異常使用多個(gè)except子句捕獲多個(gè)異常,每個(gè)except子句指定一個(gè)異常類(lèi)。將上述代碼修改為多個(gè)except子句。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])exceptNameError:#except后面指定一個(gè)異常類(lèi)print("出錯(cuò)了")exceptIndexError:#except后面指定另一個(gè)異常類(lèi)print("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語(yǔ)句10.2.1try-except語(yǔ)句(3)捕獲所有異常Python中捕獲所有異常有兩種方式,一種方式是在except子句中指定異常類(lèi)為Exception,因?yàn)镋xception是所有常見(jiàn)異常的父類(lèi),所以Exception及其子類(lèi)對(duì)應(yīng)的異常都能夠被捕獲。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])exceptException:#except后面指定異常類(lèi)為Exceptionprint("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語(yǔ)句10.2.1try-except語(yǔ)句(3)捕獲所有異常只使用except子句,并在該子句的except后面省略具體的異常類(lèi),此時(shí)程序也會(huì)捕獲所有的異常,示例代碼如下。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])except:#except后面省略異常類(lèi)print("出錯(cuò)了")異常處理的主要目的是防止因外部環(huán)境的變化導(dǎo)致程序產(chǎn)生無(wú)法控制的異常,而不是解決程序本身的設(shè)計(jì)問(wèn)題。因此,將所有的代碼都放到try子句的做法是不推薦的,try子句應(yīng)該盡量只包含可能產(chǎn)生異常的代碼。
先定一個(gè)小目標(biāo)!掌握捕獲異常信息,能夠在程序中捕獲異常信息10.2.2捕獲異常信息txt_file.txt文件的內(nèi)容捕獲異常信息當(dāng)使用try-except語(yǔ)句捕獲異常時(shí),可以使用關(guān)鍵字as獲取異常的具體信息。例如,在捕獲多個(gè)異常的示例中,使用關(guān)鍵字as獲取異常的具體信息,具體代碼如下。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])except(NameError,IndexError)aserror:#使用關(guān)鍵字as獲取異常信息print("出錯(cuò)了,原因是",error)10.2.2捕獲異常信息
先定一個(gè)小目標(biāo)!掌握try-except-else語(yǔ)句的使用,能夠通過(guò)try-except-else語(yǔ)句捕獲異常,并在else子句中添加沒(méi)有異常的處理代碼10.2.3else子句Python中try-except語(yǔ)句還可以與else子句聯(lián)合使用,組成結(jié)構(gòu)更加復(fù)雜的try-except-else語(yǔ)句。當(dāng)程序執(zhí)行try-except-else語(yǔ)句時(shí),若try子句的代碼沒(méi)有產(chǎn)生任何異常,則會(huì)執(zhí)行else子句的代碼。try-except-else語(yǔ)句的語(yǔ)法格式如下:10.2.3else子句try:
可能產(chǎn)生異常的代碼except[異常類(lèi)[as異常信息]]:
捕獲異常后的處理代碼else:
沒(méi)有異常的處理代碼語(yǔ)法格式num=input("請(qǐng)輸入每頁(yè)顯示多少條數(shù)據(jù):")try:page_size=int(num)exceptException:page_size=20print(f"當(dāng)前頁(yè)顯示{page_size}條數(shù)據(jù)")else:print(f"當(dāng)前頁(yè)顯示{page_size}條數(shù)據(jù)")
先定一個(gè)小目標(biāo)!掌握try-except-finally語(yǔ)句的使用,能夠通過(guò)try-except-finally語(yǔ)句捕獲異常,并在finally子句中添加釋放資源的代碼10.2.4finally子句Python中try-except語(yǔ)句還可以與finally子句聯(lián)合使用,組成結(jié)構(gòu)更加復(fù)雜的try-except-finally語(yǔ)句。當(dāng)程序執(zhí)行try-except-finally語(yǔ)句時(shí),若try子句的代碼沒(méi)有產(chǎn)生任何異常,都會(huì)執(zhí)行finally子句的代碼。try-except-finally語(yǔ)句的語(yǔ)法格式如下:try:
可能產(chǎn)生異常的代碼except[異常類(lèi)[as異常信息]]:
捕獲異常后的處理代碼finally:
無(wú)論是否產(chǎn)生異常都會(huì)執(zhí)行的代碼語(yǔ)法格式file=open('異常.txt','r')try:file.write("人生苦短,我用Python")exceptExceptionaserror:print("寫(xiě)入文件失敗",error)finally:file.close()print('文件已關(guān)閉')10.2.4finally子句拋出異常10.3
先定一個(gè)小目標(biāo)!掌握raise語(yǔ)句的使用,能夠在程序中通過(guò)raise語(yǔ)句拋出異常10.3.1raise語(yǔ)句raise語(yǔ)句10.3.1raise語(yǔ)句Python程序中的異常不僅可以自動(dòng)觸發(fā),還可以由開(kāi)發(fā)人員使用raise語(yǔ)句主動(dòng)引發(fā)異常。raise異常類(lèi)#格式1:使用異常類(lèi)名引發(fā)指定的異常raise異常類(lèi)對(duì)象 #格式2:使用異常類(lèi)的對(duì)象引發(fā)指定的異常raise #格式3:使用剛出現(xiàn)過(guò)的異常重新引發(fā)異常語(yǔ)法格式第1種格式和第2種格式是對(duì)等的,都會(huì)引發(fā)指定類(lèi)型的異常,其中第1種格式會(huì)隱式創(chuàng)建一個(gè)該異常類(lèi)型的對(duì)象,第2種形式是最常見(jiàn)的,它會(huì)直接提供一個(gè)該異常類(lèi)型的對(duì)象。第3種用于重新引發(fā)上下文中捕獲的異常,或默認(rèn)引發(fā)RuntimeError異常。10.3.1raise語(yǔ)句raise語(yǔ)句(1)使用異常類(lèi)引發(fā)異常raiseIndexError(2)使用異常的對(duì)象引發(fā)異常raiseIndexError()raiseIndexError('索引下標(biāo)超出范圍') #引發(fā)異常及其具體信息隱式地創(chuàng)建IndexError類(lèi)的實(shí)例顯式地創(chuàng)建IndexError類(lèi)的實(shí)例10.3.1raise語(yǔ)句raise語(yǔ)句(3)重新引發(fā)異常try:raiseIndexError('索引下標(biāo)超出范圍')except:raise再次引發(fā)剛剛發(fā)生的IndexError異常
先定一個(gè)小目標(biāo)!了解異常的傳遞,能夠說(shuō)出異常傳遞的特點(diǎn)10.3.2異常的傳遞當(dāng)Python程序中產(chǎn)生了異常,如果當(dāng)前的代碼塊沒(méi)有處理該異常,則會(huì)將該異常傳遞給調(diào)用它的上一級(jí)代碼塊。如果上一級(jí)代碼塊仍然沒(méi)有處理該異常,則會(huì)將該異常繼續(xù)向上傳遞,直至該異常被捕獲并處理,或者程序最終崩潰。10.3.2異常的傳遞
先定一個(gè)小目標(biāo)!掌握assert斷言語(yǔ)句的使用,能夠在程序中通過(guò)assert語(yǔ)句拋出異常10.3.3assert斷言語(yǔ)句10.3.3assert斷言語(yǔ)句assert斷言語(yǔ)句用于判定一個(gè)表達(dá)式是否為真,如果表達(dá)式的值為T(mén)rue,不做任何操作,否則引發(fā)AssertionError異常。assert表達(dá)式[,異常信息]語(yǔ)法格式表達(dá)式后面的異常信息是可選項(xiàng),它通常會(huì)通過(guò)字符串的形式說(shuō)明引發(fā)異常的原因。10.3.3assert斷言語(yǔ)句age=17assertage>=18,"年齡必須大于等于18歲"示例如果保證代碼能夠正確執(zhí)行,那么可以不用在程序中使用assert斷言語(yǔ)句。例如,一個(gè)會(huì)員管理系統(tǒng),要求人的年齡必須大于18歲,則可以對(duì)年齡進(jìn)行斷言,如下所示。自定義異常10.4
先定一個(gè)小目標(biāo)!掌握自定義異常的方法,能夠在程序中自定義并處理異常10.4自定義異常自定義異常10.4自定義異常Python中定義了大量的異常類(lèi),雖然這些異常類(lèi)可以描述編程時(shí)出現(xiàn)的絕大部分錯(cuò)誤情況,但仍難以涵蓋所有可能出現(xiàn)的異常。Python允許開(kāi)發(fā)人員自定義異常。自定義異常自定義異常的方式比較簡(jiǎn)單,我們只需要定義一個(gè)表示異常的類(lèi),讓它繼承Exception類(lèi)或其它異常類(lèi)即可。自定義異常類(lèi)與普通類(lèi)一樣,也可以具有自己的屬性和方法,但一般情況下不添加或者只為其添加幾個(gè)用于描述異常的詳細(xì)信息的屬性即可。classCustomError(Exception):pass#pass表示空語(yǔ)句自定義異常try:raiseCustomError("出現(xiàn)錯(cuò)誤")exceptCustomErroraserror:print(error)使用自定義異常10.4自定義異常10.4自定義異常自定義異常txt_file.txt文件的內(nèi)容classFileTypeError(Exception):def__init__(self):self.err='僅支持jpg/png/bmp格式'super().__init__(self.err)示例file_name=input("請(qǐng)輸入上傳圖片的名稱(chēng)
(包含格式):")try:iffile_name.split(".")[1]in["jpg","png","bmp"]:print("上傳成功")else:
raiseFileTypeErrorexceptExceptionaserror:print(error)with語(yǔ)句10.5
先定一個(gè)小目標(biāo)!10.5with語(yǔ)句熟悉with語(yǔ)句與上下文管理器,能夠在程序中使用with語(yǔ)句釋放資源with語(yǔ)句在使用try-except-finally捕獲異常時(shí),finally子句中的代碼必定會(huì)執(zhí)行,但這種方式過(guò)于繁瑣,在某些情況下還可以使用with語(yǔ)句替代try-except-finally語(yǔ)句。with語(yǔ)句支持創(chuàng)建資源、拋出異常、釋放資源等操作,并且可以簡(jiǎn)化代碼。with語(yǔ)句適用于對(duì)資源進(jìn)行訪(fǎng)問(wèn)的場(chǎng)合,無(wú)論資源在使用過(guò)程中是否發(fā)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)三年級(jí)足球技能提升計(jì)劃
- 鄉(xiāng)鎮(zhèn)合作發(fā)展方案范本
- 圖書(shū)館圖書(shū)倉(cāng)庫(kù)管理員崗位職責(zé)
- 音樂(lè)教學(xué)計(jì)劃與學(xué)生興趣培養(yǎng)研究
- 詐騙公司管理方案范本
- 部編版八年級(jí)語(yǔ)文課程評(píng)價(jià)計(jì)劃
- 部編版二年級(jí)下冊(cè)語(yǔ)文第四單元寫(xiě)話(huà)能力提升策略
- 辦公流程優(yōu)化調(diào)研分析
- 股骨頸骨折康復(fù)護(hù)理鍛煉
- 六年級(jí)作文演講稿子(萬(wàn)能模板14篇)
- 北京版五年級(jí)數(shù)學(xué)下學(xué)期期中復(fù)習(xí)真題
- 心理咨詢(xún)師專(zhuān)業(yè)技能培訓(xùn)課件
- 超星爾雅學(xué)習(xí)通《工程倫理(浙江大學(xué))》2025章節(jié)測(cè)試答案
- 《工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文電力工程部分2023年版》
- COMMERCIAL INVOICE 商業(yè)發(fā)票模板
- 皮帶通廊及皮帶機(jī)施工方案 (1)
- 認(rèn)識(shí)C++(教學(xué)設(shè)計(jì))小學(xué)中高年級(jí)使用
- 農(nóng)村渡口改造及小型碼頭
- 中國(guó)供應(yīng)鏈管理金融調(diào)查問(wèn)卷
- 淺析工程項(xiàng)目監(jiān)理與PMC工程項(xiàng)目管理一體化管理服務(wù)模式
- (方案二)工業(yè)機(jī)器人課程體系框架
評(píng)論
0/150
提交評(píng)論