第9章 異常處理_第1頁
第9章 異常處理_第2頁
第9章 異常處理_第3頁
第9章 異常處理_第4頁
第9章 異常處理_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

學院系部名稱主講:授課教師姓名Python基礎教程第9章異常處理

在程序設計中,需要考慮各個方面,避免出現(xiàn)錯誤。在開發(fā)中,有些情況是程序無法預料到的,對這些不能預料的情況,程序需要能進行處理。本節(jié)介紹Python中的異常情況的處理,使程序更加完善。第7章Python面向?qū)ο蟆窘虒W導航】學習目標1.了解Python異常概念2.掌握異常的幾種處理方式3.了解主動拋出異常4.了解自定義的異常類5.掌握raise和assert語句,會拋出自定義的異常教學重點掌握異常的幾種處理方式掌握raise和assert語句,會拋出自定義的異常教學方式案例教學法、分組討論法、自主學習法、探究式訓練法課時建議4課時本章主要內(nèi)容with語句異常拋出異常123實訓949.1.1異常

有些錯誤在程序中是可以控制的。當Python系統(tǒng)檢測到一個錯誤時,解釋器會報告當前的程序代碼流無法執(zhí)行下去了,這時候就出現(xiàn)了異常。

異常(Exception)是程序的執(zhí)行過程中用來解決錯誤、避免直接終止程序運行的手段(行為)。

異常即是一個事件,該事件會在程序執(zhí)行過程中發(fā)生,影響程序的正常執(zhí)行。一般情況下,在Python無法正常處理程序時就會發(fā)生一個異常。

異常是Python對象,表示一個錯誤。當Python腳本發(fā)生異常時我們需要捕獲處理它,否則程序會終止執(zhí)行。9.1.1異常

異常是程序出現(xiàn)了錯誤為排除錯誤而在正??刂屏髦獠扇〉男袨椋▌幼鳎?。這個行為動作又分為兩個階段:首先是異常的發(fā)生,它是因為某個錯誤引起的,所以有人說是異常發(fā)生的條件;然后是檢測和處理異常。

第一階段:檢測異常,解釋器將觸發(fā)一個異常信號,另外,程序也可以自己引發(fā)異常信號。

只要有異常(信號),解釋器都要暫停當前正在執(zhí)行的程序流,而去處理因為錯誤引發(fā)的異常,這就要轉(zhuǎn)入第二階段的工作。

第二階段:處理異常,這包括忽略錯誤或采取補救措施讓程序繼續(xù)執(zhí)行。無論是哪種方式都代表執(zhí)行的繼續(xù),我們也可以認為這種工作是程序控制流的一個控制分支。9.1.1異常

因為有了異常處理,程序員可以控制程序如何運行,這讓程序有了更好的可控性

不是所有的錯誤都可以通過異常進行處理的。也就是說,程序員不可能預見所有的錯誤。

Python系統(tǒng)可能產(chǎn)生異常,如果這個異常對象沒有進行處理和捕捉,程序就會用所謂的回溯(Traceback,一種錯誤信息)終止執(zhí)行,這些信息包括錯誤的名稱(例如NameError)、原因和錯誤發(fā)生的行號。

9.1.1異常Python系統(tǒng)可能產(chǎn)生的常見異常介紹如下。 1.BaseException和ExceptionBaseException是頂層的異常,Exception是BaseException的下層異常。 2.NameError這是企圖訪問一個未申明的變量而引發(fā)的NameError。錯誤類型是:NameError:name'……'isnotdefined。 3.ZeroDivisionError

當除數(shù)為零時,會引發(fā)ZeroDivisionError異常。錯誤類型是:ZeroDivisionError:divisionbyzero。

9.1.1異常 4.SyntaxError程序代碼中有語法錯誤,這種異常是非程序運行時的錯誤,只能在程序運行前糾錯,也就是說,不可能用異常處理該錯誤。當解釋器發(fā)現(xiàn)有語法錯誤時,會引發(fā)SyntaxError異常。錯誤類型是:SyntaxError:invalidsyntax。 5.IndexError請求的索引超出了序列范圍,即當使用序列中不存在的索引時,會引發(fā)IndexError異常。錯誤類型是:IndexError:listindexoutofrange。

9.1.1異常 6.KeyError請求一個不存在的字典關鍵字。當使用映射中不存在的鍵時,會引發(fā)KeyError異常。錯誤類型是:KeyError:'server'。

7.FileNotFoundError企圖打開一個不存在的文件,會引發(fā)FileNotFoundError。錯誤類型是:FileNotFoundError:[Errno2]Nosuchfileordirectory。 8.AttributeError企圖訪問某對象的不存在的屬性,即當嘗試訪問未知對象屬性時,會引發(fā)AttributeError異常。9.1.1異常錯誤類型是:AttributeError:“objecthasnoattribute”。所有異常都是基類Exception的成員,它們都定義在exceptions模塊中。在表9-1-1中,列舉了一些標準異常,并作了相應描述。

表9-1-1標準異常一覽表異常名稱描述BaseException所有異常的父類SystemExit解釋器請求退出KeyboardInterrupt用戶中斷執(zhí)行(通常是輸入^C)Exception常規(guī)錯誤的父類StopIteration迭代器沒有更多的值GeneratorExit生成器(generator)發(fā)生異常來通知退出9.1.1異常

續(xù)表9-1-1標準異常一覽表異常名稱描述StandardError所有的內(nèi)置標準異常的父類ArithmeticError所有數(shù)值計算錯誤的父類FloatingPointError浮點計算錯誤OverflowError數(shù)值運算超出最大限制ZeroDivisionError除(或取模)零(所有數(shù)據(jù)類型)AssertionError斷言語句失敗AttributeError對象沒有這個屬性EOFError沒有內(nèi)建輸入,到達EOF標記EnvironmentError操作系統(tǒng)錯誤的父類IOError輸入/輸出操作失敗OSError操作系統(tǒng)錯誤WindowsError系統(tǒng)調(diào)用失敗9.1.1異常

續(xù)表9-1-1標準異常一覽表異常名稱描述ImportError導入模塊/對象失敗LookupError無效數(shù)據(jù)查詢的父類IndexError序列中沒有此索引(index)KeyError映射中沒有這個鍵MemoryError內(nèi)存溢出錯誤(對于Python解釋器不是致命的)NameError未聲明/初始化對象(沒有屬性)UnboundLocalError訪問未初始化的本地變量ReferenceError弱引用(WeakReference)試圖訪問已經(jīng)垃圾回收了的對象RuntimeError一般的運行時錯誤NotImplementedError尚未實現(xiàn)的方法SyntaxErrorPython語法錯誤9.1.1異常

續(xù)表9-1-1標準異常一覽表異常名稱描述IndentationError縮進錯誤TabErrorTab和空格混用SystemError一般的解釋器系統(tǒng)錯誤TypeError對類型無效的操作ValueError傳入無效的參數(shù)UnicodeErrorUnicode相關的錯誤UnicodeDecodeErrorUnicode解碼時的錯誤UnicodeEncodeErrorUnicode編碼時錯誤UnicodeTranslateErrorUnicode轉(zhuǎn)換時錯誤Warning警告的父類DeprecationWarning關于被棄用的特征的警告9.1.1異常

續(xù)表9-1-1標準異常一覽表異常名稱描述FutureWarning關于構造將來語義會有改變的警告OverflowWarning舊的關于自動提升為長整型(long)的警告PendingDeprecationWarning關于特性將會被廢棄的警告RuntimeWarning可疑的運行時行為(runtimebehavior)的警告SyntaxWarning可疑的語法的警告UserWarning用戶代碼生成的警告9.1.2異常的檢測與處理異常的檢測與處理是用try語句來實現(xiàn)的。try語句有以下兩種基本形式,格式如下:●try…except●try…finally對于第1種形式,except子句可有多個;在第2種形式中,finally子句只能有一個。try語句在兩種基本形式基礎上,還可以將兩者復合起來使用,格式如下:try…except…finally這種形式是復合語句。try子句的下面(或說后面)是被檢測的語句塊,except子句的下面是異常處理語句塊,finally子句的下面是無論有無異常都執(zhí)行的語句塊9.1.2異常的檢測與處理1.try…except語句捕捉異常可以使用try…except語句。try…except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息并處理。如果不想在異常發(fā)生時結束程序,只需在try里捕獲它。以下為簡單的try…except…else的語法:9.1.2異常的檢測與處理try的工作原理是,當開始一個try語句后,Python就在當前程序的上下文中作標記,這樣當異常出現(xiàn)時就可以回到這里,try子句先執(zhí)行,接下來會發(fā)生什么依賴于執(zhí)行時是否出現(xiàn)異常。

●如果當try后的語句執(zhí)行時發(fā)生異常,Python就跳回到try并執(zhí)行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發(fā)新的異常)。

●如果在try后的語句里發(fā)生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,并打印默認的出錯信息)。

●如果在try子句執(zhí)行時沒有發(fā)生異常,Python將執(zhí)行else語句后的語句(如果有else的話),然后控制流通過整個try語句。9.1.2異常的檢測與處理如例9-1-1和例9-2-2所示操作實例分別為不進行異常處理和進行異常處理(添加except語句捕獲異常)兩種實例。

代碼做以下修改,實現(xiàn)異常處理,修改參考如例9-1-2所示。原代碼照樣執(zhí)行,由于增加了異常檢測,避免了程序代碼的終止。程序監(jiān)控到錯誤,執(zhí)行except中的語句,不再執(zhí)行try中未執(zhí)行的語句,從而增強了代碼的魯棒性。

9.1.2異常的檢測與處理

例9-1-2所示操作實例進行了異常處理,添加except語句捕獲異常。但一般情況下,異常只會在出現(xiàn)某種情況下才能發(fā)生,此時可以添加else語句。當try語句中操作正常,沒有捕獲到任何錯誤信息,就不再執(zhí)行except語句,而是執(zhí)行else語句的內(nèi)容,從而實現(xiàn)程序的友好性。操作實例如例9-1-3所示,結合例9-1-4進行深一步理解。

例9-1-3打開test.txt文件(如果沒有則自動創(chuàng)建),寫入內(nèi)容如下:9.1.2異常的檢測與處理

例9-1-3是一個簡單的例子,它打開一個文件,在該文件中寫入內(nèi)容,且并未發(fā)生異常的情況。

重新處理該文件,實例如例9-1-4所示。

例9-1-4設置test.txt屬性為只讀,寫入內(nèi)容。

打開test.txt文件,往該文件中寫入內(nèi)容,但文件沒有寫入權限,所以發(fā)生了異常。在之前的實例中,except都帶了一個異常類型。在使用except時,還可以帶多個異常類型或不帶任何異常類型,實現(xiàn)使用相同的except語句來處理多個異常信息。

9.1.2異常的檢測與處理使用except而帶多種異常類型,書寫格式如下所示,操作實例如例9-1-5所示。except(Exception1[,Exception2[,...ExceptionN]]]):例9-1-5實際開發(fā)中,捕獲多個異常的方式操作實例。

當捕獲多個異常時,可以把要捕獲的異常的名字放到except后,并使用元組的方式僅進行存儲操作。

9.1.2異常的檢測與處理

在操作中,當出現(xiàn)多種異常時,為了區(qū)分不同的錯誤信息,用戶需要知道錯誤信息的情況,此時可以使用as來獲取系統(tǒng)反饋的信息??梢园牙?-1-5操作代碼進行改寫,改寫代碼參考如下:當程序中出現(xiàn)大量異常時,捕獲這些異常是非常麻煩的。這時,可以在except子句中不指明異常的類型,使用except不帶任何異常類型。這樣,不管發(fā)生何種類型的異常,都會執(zhí)行except中的處理代碼。使用except不帶任何異常類型,就是指except后不需要添加任何參數(shù),如例9-1-6所示9.1.2異常的檢測與處理

例9-1-6except不帶任何異常類型操作實例。

以上方式try…except語句捕獲所有發(fā)生的異常。但這不是一個很好的處理方式,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常,所以建議except后帶相關異常類型。9.1.2異常的檢測與處理在之前介紹的實例中,實現(xiàn)程序異常處理時使用了try…except…else…語句。但有時候,在程序中,不管有沒有捕捉到異常,都要執(zhí)行一些終止行為,比如關閉文件、釋放鎖等。此時使用try…except…else…語句難以實現(xiàn)效果,可以使用以下語句進行處理:

●try…finally語句。try…finally語句無論是否發(fā)生異常都將執(zhí)行最后的代碼。9.1.2異常的檢測與處理

如果在使用finally語句的同時使用except語句和else語句,操作格式如下所示。

其中,else語句和finally語句不是必需的。except語句必須在else語句和finally語句之前,else語句必須在finally語句之前。finally語句如果存在,必須在整個語句的最后位置。finally語句通常用于釋放資源。

●使用finally語句,改寫例9-1-3,代碼如下所示。

9.1.2異常的檢測與處理

例9-1-7打開test.txt文件,同時使用except語句與finally語句,實例代碼如下:9.2拋出異常

在Python中,程序運行出現(xiàn)錯誤就會引發(fā)異常。有時需要在程序中主動拋出異常,此時可以使用raise和assert語句。本節(jié)主要針對拋出異常進行詳細介紹。[學習目標]1.了解異常拋出方式2.掌握raise語句的用法3.掌握assert語句的用法4.掌握用戶自定義異常操作9.2.1拋出異常處理

異常并非只有在程序運行出錯時才可以引發(fā),Python允許在代碼中使用raise或assert語句主動引發(fā)異常。

1.raise語句Python執(zhí)行raise語句時,會引發(fā)異常并傳遞異常類的實例對象。使用raise語句能顯式地觸發(fā)異常,分為三種情況進行處理。

(1)用類名引發(fā)異常,創(chuàng)建異常類的實例對象,并引發(fā)異常,基本格式如下:

raise異常類名raise語句中,指定異常類名時,創(chuàng)建該類的實例對象,然后引發(fā)異常。使用時直接寫出類名。例如:raiseIndexErrorIndexError是一個異常類,編碼時不實例化,執(zhí)行時會進行創(chuàng)建

(2)用異常類實例對象引發(fā)異常,引發(fā)異常類實例對象對應的異常,基本格式如下: raise異常類對象

9.2.1拋出異常處理

raise語句中,使用異常類實例對象引發(fā)異常時,通過顯式地創(chuàng)建異常類的實例,直接使用該實例來引發(fā)異常。例如: index=IndexError() raiseindex

(3)重新引發(fā)剛剛發(fā)生的異常,基本格式如下:此時,不帶參數(shù)的raise語句,可以再次引發(fā)剛剛發(fā)生過的異常,作用就是向外傳遞異常。操作如例9-2-1所示。

例9-2-1再次引發(fā)剛發(fā)生的異常實例。9.2.1拋出異常處理在上述代碼中,try里面使用raise語句拋出了IndexError異常,程序會跳轉(zhuǎn)到except子句中執(zhí)行,執(zhí)行print()語句打印信息,然后再次執(zhí)行raise語句,引發(fā)剛剛發(fā)生的異常,導致程序出現(xiàn)錯誤而終止執(zhí)行。有時,異常中可能會有另外一個異常,可以使用raise…from…語句拋出異常。操作如例9-2-2所示

例9-2-2在異常中拋出另外一個異常實例。在實例9-2-2中,try語句中只定義了變量i,并沒有為其賦值,引發(fā)了NameError錯誤,使程序跳轉(zhuǎn)到except子句中執(zhí)行。except語句捕捉所有異常,使用raise…from…語句拋出NameError異常后,再拋出“數(shù)值超出范圍”異常。9.2.1拋出異常處理2.a(chǎn)ssert語句 assert語句也叫斷言,是期望用戶滿足指定條件,當用戶的條件不滿足約束條件時,會觸發(fā)AssertionError異常,所以,assert語句可以當作條件式的raise語句。assert語句格式如下: assert邏輯表達式,data

其中,邏輯表達式是條件。data是可選項,通常是一個字符串,根據(jù)情況進行添加或去除。當邏輯表達式的結果為False時,作為異常類型的描述信息使用,相當于以下語句:ifnot邏輯表達式: raiseAssertionError(data)

斷言操作實例如例9-2-3所示

例9-2-3斷言操作實例。9.2.1拋出異常處理在例9-2-3中,首先定義了變量a為5,然后使用斷言a的值不能為5,此時這兩個存在沖突,引發(fā)了異常。assert語句用來收集用戶定義的約束條件,而不是捕捉內(nèi)在的程序錯誤。因為Python會自行收集程序錯誤,在發(fā)現(xiàn)錯誤時自動引發(fā)異常。操作實例如例9-2-4所示。

例9-2-4assert語句收集用戶約束條件實例。9.2.2用戶自定義異常前面捕捉的異常是標準異常,是系統(tǒng)內(nèi)置的,在某些錯誤出現(xiàn)時自動觸發(fā)。但有時候Python自帶異常不夠用,如同Java,Python也可以自定義異常,并且可以手動拋出。由用戶根據(jù)自己需要設置的異常就是自定義異常,自定義異常只能由用戶拋出,系統(tǒng)不能自動識別此類異常。通過創(chuàng)建一個新的異常類,程序可以命名它們自己的異常。Python的異常有個大基類,繼承的是Exception。典型的異常通過直接或間接的方式繼承自Exception類。

前面介紹的異常是由Python解釋器引發(fā)的異常,而raise語句是程序員編寫在應用程序中的,由應用程序自己引發(fā)異常。操作實例如例9-2-5所示。

9.2.2用戶自定義異常

例9-2-5自定義異常實例。

在例9-2-5中,定義了input類,繼承Exception,作為一個異常類使用。若用戶輸入的密碼位數(shù)不符合要求時,拋出input異常,并使用except語句進行異常捕獲。如果沒有異常,則執(zhí)行else語句內(nèi)容

classInput(Exception):'''自定義異常類'''def__init__(self,length,minLength):self.length=length#輸入的密碼位數(shù)

self.minLength=minLength#最低位數(shù)try:text=input("請輸入密碼:")iflen(text)<6:#raise引發(fā)定義好的異常

raiseInput(len(text),6)exceptEOFError:print("你輸入了結束標記!")exceptinputasresult:print("自定義異常類input接收到輸入的位數(shù)是%d,""位數(shù)至少應是%d"%(result.length,result.minLength))else: print("操作正常")9.3with語句[學習目標]1.了解with語句的語法結構2.掌握with語句的使用方法3.了解上下文管理器概念4.了解上下文管理協(xié)議9.3with語句1.with語句with語句是在Python2.5后的版本中得到支持的。在Python2.5以前的版本中,要正確處理涉及到異常的資源管理時,需要使用try…finally代碼結構。如要實現(xiàn)文件在操作出現(xiàn)異常時也能正確關閉,操作實例如例9-3-1所示。

例9-3-1使用異常處理方式打開文件。

不管文件操作有沒有出現(xiàn)異常,try…finally中的finally語句都會執(zhí)行,從而保證文件的正確關閉,但是這種寫法不簡潔。with語句適用于對資源進行訪問的場合,確保不管使用過程中是否發(fā)生異常都會執(zhí)行必要的“清理”工作,釋放資源。9.3with語句 with語句的基本語法結構在第8章文件處理部分已作簡單介紹,這里將表達式明確為上下文表達式,如下所示: with上下文表達式[as資源對象]:

對象操作語句

用with語句改寫例9-3-1,操作實例如例9-3-2所示。

例9-3-2使用with語句打開文件。

使用with語句相對try…finally來說簡潔了很多,而且也不需要寫f.close()來關閉文件。

9.3with語句2.上下文管理器 with語句可以寫得如此簡單但功能強大,主要依賴于上下文管理器。

上下文管理器就是實現(xiàn)了上下文協(xié)議的類,而上下文協(xié)議就是一個類要實現(xiàn)__enter__()和__exit__()兩個方法。一個類只要實現(xiàn)了__enter__()和__exit__(),就稱為上下文管理器。下面簡要介紹這兩個方法。 __enter__():主要執(zhí)行一些環(huán)境準備工作,同時返回一個資源對象。例如,上下文管理器open("test.txt")的__enter__()函數(shù)返回一個文件對象。

9.3with語句

__exit__

溫馨提示

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

評論

0/150

提交評論