Python程序開發(fā)案例教程(第2版)課件 第10章 錯(cuò)誤和異常_第1頁
Python程序開發(fā)案例教程(第2版)課件 第10章 錯(cuò)誤和異常_第2頁
Python程序開發(fā)案例教程(第2版)課件 第10章 錯(cuò)誤和異常_第3頁
Python程序開發(fā)案例教程(第2版)課件 第10章 錯(cuò)誤和異常_第4頁
Python程序開發(fā)案例教程(第2版)課件 第10章 錯(cuò)誤和異常_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第10章錯(cuò)誤和異?!禤ython程序開發(fā)案例教程(第2版))》學(xué)習(xí)目標(biāo)/Target了解錯(cuò)誤和異常,能夠說出什么是錯(cuò)誤和異常熟悉異常的類型,能夠理解常見異常類的含義掌握try-except語句的使用,能夠在程序中通過try-except語句捕獲與處理異常掌握try-except-else語句的使用,能夠通過try-except-else語句捕獲異常,并在else子句中添加沒有異常的處理代碼掌握try-except-finally語句的使用,能夠通過try-except-finally語句捕獲異常,并在finally子句中添加釋放資源的代碼學(xué)習(xí)目標(biāo)/Target掌握raise語句的使用,能夠在程序中通過raise語句拋出異常了解異常的傳遞,能夠說出異常傳遞的特點(diǎn)掌握assert斷言語句的使用,能夠在程序中通過assert語句拋出異常掌握自定義異常的方法,能夠在程序中自定義并處理異常熟悉with語句與上下文管理器,能夠在程序中使用with語句釋放資源章節(jié)概述/Summary在現(xiàn)實(shí)生活中,我們經(jīng)常會遇到各種突發(fā)情況,比如航班延誤、火車晚點(diǎn)、交通堵塞等。而在程序中同樣不可避免地會出現(xiàn)異常,比如試圖打開一個(gè)不存在的文件、訪問未定義的變量等,這些異常默認(rèn)情況下都會導(dǎo)致程序崩潰而無法正常執(zhí)行。為了增強(qiáng)程序的穩(wěn)定性,Python提供了強(qiáng)大的異常處理機(jī)制,它不僅可以捕獲以及處理異常,防止程序崩潰,還提供詳細(xì)的診斷信息,幫助開發(fā)人員快速定位和解決問題。接下來,本章將針對錯(cuò)誤和異常的內(nèi)容進(jìn)行講解。目錄/Contents010203錯(cuò)誤和異常概述捕獲與處理異常拋出異常目錄/Contents040506自定義異常with語句實(shí)例:身份歸屬地查詢錯(cuò)誤和異常概述10.1

先定一個(gè)小目標(biāo)!了解錯(cuò)誤和異常,能夠說出什么是錯(cuò)誤和異常10.1.1認(rèn)識錯(cuò)誤和異常1.語法錯(cuò)誤10.1.1認(rèn)識錯(cuò)誤和異常語法錯(cuò)誤又稱解析錯(cuò)誤,是指違反了Python語法規(guī)則的代碼所引起的錯(cuò)誤,通常是由開發(fā)人員在編寫代碼時(shí)造成的。語法錯(cuò)誤在被解釋器執(zhí)行之前就能由代碼編輯器檢測出來,需要開發(fā)人員修復(fù)以保證代碼的正確性。2.邏輯錯(cuò)誤10.1.1認(rèn)識錯(cuò)誤和異常邏輯錯(cuò)誤是指代碼在語法上是正確的,但邏輯上存在問題,導(dǎo)致程序無法按照預(yù)期的方式執(zhí)行。邏輯錯(cuò)誤可能由錯(cuò)誤的算法、錯(cuò)誤的條件判斷或錯(cuò)誤的數(shù)據(jù)處理等引起。whileTrueprint("語法格式錯(cuò)誤")解析錯(cuò)誤示例循環(huán)條件的后面缺少冒號radius=5area=2*3.14*radius#錯(cuò)誤的公式print("圓的面積:",area)異常示例2πr是計(jì)算圓的周長,不是計(jì)算圓的面積10.1.1認(rèn)識錯(cuò)誤和異常示例演示3.異常10.1.1認(rèn)識錯(cuò)誤和異常異常是在程序運(yùn)行時(shí)期間發(fā)生的錯(cuò)誤,可能是由于外部環(huán)境、不正確的輸入、無效的操作或其他因素引起的。與錯(cuò)誤不同,異常通常是由解釋器在程序執(zhí)行期間檢測到的,并在處理異常的機(jī)制下進(jìn)行處理。注意,如果異常沒有被程序進(jìn)行處理,程序默認(rèn)的處理方式是直接終止運(yùn)行并給出錯(cuò)誤信息。File"D:\ProgramDev2\Chapter10\test.py",line1whileTrue^SyntaxError:expected':'示例

先定一個(gè)小目標(biāo)!熟悉異常的類型,能夠理解常見異常類的含義10.1.2異常的類型Python中所有的異常均由類實(shí)現(xiàn),所有的異常類又繼承自BaseException類,程序運(yùn)行時(shí)出現(xiàn)的異常大多繼承自Exception類。異常的類型10.1.2異常的類型解釋器退出異常中斷執(zhí)行時(shí)產(chǎn)生的異常內(nèi)置異常的基類生成器退出異常Exception類派生了很多子類,每個(gè)子類都是開發(fā)中經(jīng)常遇到的異常。Exception的常見子類及其描述如表所示。異常的類型10.1.2異常的類型類名描述SyntaxError當(dāng)程序中有語法錯(cuò)誤時(shí)引發(fā)的異常FileNotFoundError當(dāng)程序未找到指定文件或目錄時(shí)引發(fā)的異常NameError當(dāng)程序找不到指定名稱的變量時(shí)引發(fā)的異常ZeroDivisionError當(dāng)程序中使用的除數(shù)為0時(shí)引發(fā)的異常IndexError當(dāng)程序中使用了超出序列范圍的索引時(shí)引發(fā)的異常KeyError當(dāng)程序中使用不存在的鍵訪問字典時(shí)引發(fā)的異常AttributeError當(dāng)程序嘗試訪問對象的未知屬性時(shí)引發(fā)的異常TypeError當(dāng)程序在使用某類型的場合使用其他類型時(shí)引發(fā)的異常捕獲與處理異常10.2

先定一個(gè)小目標(biāo)!掌握try-except語句的使用,能夠在程序中通過try-except語句捕獲與處理異常10.2.1try-except語句try-except語句10.2.1try-except語句try:

可能出錯(cuò)的代碼except[異常類[as異常信息]]:

捕獲異常后的處理代碼語法格式執(zhí)行過程執(zhí)行try子句中可能出錯(cuò)的代碼若try子句中沒有產(chǎn)生異常,跳過except子句的代碼若產(chǎn)生異常,跳過try子句中出錯(cuò)行及之后的代碼,執(zhí)行except子句的代碼321txt_file.txt文件的內(nèi)容try-except語句10.2.1try-except語句(1)捕獲單個(gè)異常當(dāng)使用try-except語句捕獲異常時(shí),如果except后面指定一個(gè)異常類,那么此時(shí)程序只會捕獲與異常類對應(yīng)的單個(gè)異常。try:foriin2:print(i)exceptTypeError:

#except后面指定一個(gè)異常類print("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語句10.2.1try-except語句(2)捕獲多個(gè)異常一段代碼運(yùn)行后可能會產(chǎn)生多個(gè)異常。當(dāng)使用try-except語句捕獲異常時(shí),如果except后面指定包含多個(gè)異常類的元組,那么此時(shí)程序會捕獲與異常類對應(yīng)的多個(gè)異常。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])except(NameError,IndexError):#except后面指定多個(gè)異常類print("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語句10.2.1try-except語句(2)捕獲多個(gè)異常使用多個(gè)except子句捕獲多個(gè)異常,每個(gè)except子句指定一個(gè)異常類。將上述代碼修改為多個(gè)except子句。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])exceptNameError:#except后面指定一個(gè)異常類print("出錯(cuò)了")exceptIndexError:#except后面指定另一個(gè)異常類print("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語句10.2.1try-except語句(3)捕獲所有異常Python中捕獲所有異常有兩種方式,一種方式是在except子句中指定異常類為Exception,因?yàn)镋xception是所有常見異常的父類,所以Exception及其子類對應(yīng)的異常都能夠被捕獲。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])exceptException:#except后面指定異常類為Exceptionprint("出錯(cuò)了")txt_file.txt文件的內(nèi)容try-except語句10.2.1try-except語句(3)捕獲所有異常只使用except子句,并在該子句的except后面省略具體的異常類,此時(shí)程序也會捕獲所有的異常,示例代碼如下。try:print(count)demo_list=["Python","Java","C","C++"]print(demo_list[5])except:#except后面省略異常類print("出錯(cuò)了")異常處理的主要目的是防止因外部環(huán)境的變化導(dǎo)致程序產(chǎn)生無法控制的異常,而不是解決程序本身的設(shè)計(jì)問題。因此,將所有的代碼都放到try子句的做法是不推薦的,try子句應(yīng)該盡量只包含可能產(chǎn)生異常的代碼。

先定一個(gè)小目標(biāo)!掌握捕獲異常信息,能夠在程序中捕獲異常信息10.2.2捕獲異常信息txt_file.txt文件的內(nèi)容捕獲異常信息當(dāng)使用try-except語句捕獲異常時(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語句的使用,能夠通過try-except-else語句捕獲異常,并在else子句中添加沒有異常的處理代碼10.2.3else子句Python中try-except語句還可以與else子句聯(lián)合使用,組成結(jié)構(gòu)更加復(fù)雜的try-except-else語句。當(dāng)程序執(zhí)行try-except-else語句時(shí),若try子句的代碼沒有產(chǎn)生任何異常,則會執(zhí)行else子句的代碼。try-except-else語句的語法格式如下:10.2.3else子句try:

可能產(chǎn)生異常的代碼except[異常類[as異常信息]]:

捕獲異常后的處理代碼else:

沒有異常的處理代碼語法格式num=input("請輸入每頁顯示多少條數(shù)據(jù):")try:page_size=int(num)exceptException:page_size=20print(f"當(dāng)前頁顯示{page_size}條數(shù)據(jù)")else:print(f"當(dāng)前頁顯示{page_size}條數(shù)據(jù)")

先定一個(gè)小目標(biāo)!掌握try-except-finally語句的使用,能夠通過try-except-finally語句捕獲異常,并在finally子句中添加釋放資源的代碼10.2.4finally子句Python中try-except語句還可以與finally子句聯(lián)合使用,組成結(jié)構(gòu)更加復(fù)雜的try-except-finally語句。當(dāng)程序執(zhí)行try-except-finally語句時(shí),若try子句的代碼沒有產(chǎn)生任何異常,都會執(zhí)行finally子句的代碼。try-except-finally語句的語法格式如下:try:

可能產(chǎn)生異常的代碼except[異常類[as異常信息]]:

捕獲異常后的處理代碼finally:

無論是否產(chǎn)生異常都會執(zhí)行的代碼語法格式file=open('異常.txt','r')try:file.write("人生苦短,我用Python")exceptExceptionaserror:print("寫入文件失敗",error)finally:file.close()print('文件已關(guān)閉')10.2.4finally子句拋出異常10.3

先定一個(gè)小目標(biāo)!掌握raise語句的使用,能夠在程序中通過raise語句拋出異常10.3.1raise語句raise語句10.3.1raise語句Python程序中的異常不僅可以自動(dòng)觸發(fā),還可以由開發(fā)人員使用raise語句主動(dòng)引發(fā)異常。raise異常類#格式1:使用異常類名引發(fā)指定的異常raise異常類對象 #格式2:使用異常類的對象引發(fā)指定的異常raise #格式3:使用剛出現(xiàn)過的異常重新引發(fā)異常語法格式第1種格式和第2種格式是對等的,都會引發(fā)指定類型的異常,其中第1種格式會隱式創(chuàng)建一個(gè)該異常類型的對象,第2種形式是最常見的,它會直接提供一個(gè)該異常類型的對象。第3種用于重新引發(fā)上下文中捕獲的異常,或默認(rèn)引發(fā)RuntimeError異常。10.3.1raise語句raise語句(1)使用異常類引發(fā)異常raiseIndexError(2)使用異常的對象引發(fā)異常raiseIndexError()raiseIndexError('索引下標(biāo)超出范圍') #引發(fā)異常及其具體信息隱式地創(chuàng)建IndexError類的實(shí)例顯式地創(chuàng)建IndexError類的實(shí)例10.3.1raise語句raise語句(3)重新引發(fā)異常try:raiseIndexError('索引下標(biāo)超出范圍')except:raise再次引發(fā)剛剛發(fā)生的IndexError異常

先定一個(gè)小目標(biāo)!了解異常的傳遞,能夠說出異常傳遞的特點(diǎn)10.3.2異常的傳遞當(dāng)Python程序中產(chǎn)生了異常,如果當(dāng)前的代碼塊沒有處理該異常,則會將該異常傳遞給調(diào)用它的上一級代碼塊。如果上一級代碼塊仍然沒有處理該異常,則會將該異常繼續(xù)向上傳遞,直至該異常被捕獲并處理,或者程序最終崩潰。10.3.2異常的傳遞

先定一個(gè)小目標(biāo)!掌握assert斷言語句的使用,能夠在程序中通過assert語句拋出異常10.3.3assert斷言語句10.3.3assert斷言語句assert斷言語句用于判定一個(gè)表達(dá)式是否為真,如果表達(dá)式的值為True,不做任何操作,否則引發(fā)AssertionError異常。assert表達(dá)式[,異常信息]語法格式表達(dá)式后面的異常信息是可選項(xiàng),它通常會通過字符串的形式說明引發(fā)異常的原因。10.3.3assert斷言語句age=17assertage>=18,"年齡必須大于等于18歲"示例如果保證代碼能夠正確執(zhí)行,那么可以不用在程序中使用assert斷言語句。例如,一個(gè)會員管理系統(tǒng),要求人的年齡必須大于18歲,則可以對年齡進(jìn)行斷言,如下所示。自定義異常10.4

先定一個(gè)小目標(biāo)!掌握自定義異常的方法,能夠在程序中自定義并處理異常10.4自定義異常自定義異常10.4自定義異常Python中定義了大量的異常類,雖然這些異常類可以描述編程時(shí)出現(xiàn)的絕大部分錯(cuò)誤情況,但仍難以涵蓋所有可能出現(xiàn)的異常。Python允許開發(fā)人員自定義異常。自定義異常自定義異常的方式比較簡單,我們只需要定義一個(gè)表示異常的類,讓它繼承Exception類或其它異常類即可。自定義異常類與普通類一樣,也可以具有自己的屬性和方法,但一般情況下不添加或者只為其添加幾個(gè)用于描述異常的詳細(xì)信息的屬性即可。classCustomError(Exception):pass#pass表示空語句自定義異常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("請輸入上傳圖片的名稱

(包含格式):")try:iffile_name.split(".")[1]in["jpg","png","bmp"]:print("上傳成功")else:

raiseFileTypeErrorexceptExceptionaserror:print(error)with語句10.5

先定一個(gè)小目標(biāo)!10.5with語句熟悉with語句與上下文管理器,能夠在程序中使用with語句釋放資源with語句在使用try-except-finally捕獲異常時(shí),finally子句中的代碼必定會執(zhí)行,但這種方式過于繁瑣,在某些情況下還可以使用with語句替代try-except-finally語句。with語句支持創(chuàng)建資源、拋出異常、釋放資源等操作,并且可以簡化代碼。with語句適用于對資源進(jìn)行訪問的場合,無論資源在使用過程中是否發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論