第7章 異常處理與文件操作《Python語言程序設(shè)計》教學(xué)課件_第1頁
第7章 異常處理與文件操作《Python語言程序設(shè)計》教學(xué)課件_第2頁
第7章 異常處理與文件操作《Python語言程序設(shè)計》教學(xué)課件_第3頁
第7章 異常處理與文件操作《Python語言程序設(shè)計》教學(xué)課件_第4頁
第7章 異常處理與文件操作《Python語言程序設(shè)計》教學(xué)課件_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

《Python語言程序設(shè)計》?精品課件合集Python語言程序設(shè)計第7章異常處理與文件操作程序在編制的過程中,難免包含各種各樣的缺陷和錯誤,雖然我們已經(jīng)盡可能編寫正確的程序,但這并不足以消滅所有導(dǎo)致程序出錯的因素,所以,必須學(xué)會使用異常處理機(jī)制來削弱可能發(fā)生的錯誤對程序運(yùn)行產(chǎn)生的負(fù)面作用。引言2/39第7章異常處理與文件操作7.1異常處理Python語言程序中的錯誤通常被分為3種,分別是語法錯誤、語義錯誤和運(yùn)行時錯誤。由于包含語法錯誤的程序無法順利被Python解釋器識別,所以Python開發(fā)工具會幫助我們在運(yùn)行程序前就修正各種語法錯誤。語義錯誤,也被稱作邏輯錯誤,包含這種錯誤的程序雖然可以運(yùn)行,但是無法得到預(yù)期的結(jié)果。運(yùn)行時錯誤(異常),是指程序在運(yùn)行過程中產(chǎn)生的未預(yù)期的錯誤。Python語言程序中的錯誤4/39Python語言程序中的錯誤通常被分為3種,分別是語法錯誤、語義錯誤和運(yùn)行時錯誤。由于包含語法錯誤的程序無法順利被Python解釋器識別,所以Python開發(fā)工具會幫助我們在運(yùn)行程序前就修正各種語法錯誤。語義錯誤,也被稱作邏輯錯誤,包含這種錯誤的程序雖然可以運(yùn)行,但是無法得到預(yù)期的結(jié)果。運(yùn)行時錯誤(異常),是指程序在運(yùn)行過程中產(chǎn)生的未預(yù)期的錯誤。為了提高軟件的容錯性、改善軟件在遇到錯誤時的用戶體驗(yàn),Python提供了一種名為異常處理的機(jī)制,這種機(jī)制幫助程序更好地應(yīng)對運(yùn)行時錯誤(即異常),避免軟件系統(tǒng)因?yàn)橛龅藉e誤而直接崩潰。Python語言程序中的錯誤5/39例如,編寫程序提示用戶從鍵盤上輸入兩個整數(shù),打印這兩個整數(shù)的實(shí)數(shù)商,程序如下:程序的運(yùn)行結(jié)果如下:包含異常的程序舉例6/39在Python中使用try和except關(guān)鍵字可以構(gòu)建最基本的異常處理程序,語法格式如下:try:

語句塊1except:

語句塊2其中,由關(guān)鍵字try引導(dǎo)的語句塊1是需要對其進(jìn)行異常捕獲的程序,即語句塊1中的程序在運(yùn)行過程中如果產(chǎn)生了異常,就會運(yùn)行由關(guān)鍵字except引導(dǎo)的語句塊2,例如(見下頁):try…except…語句7/39運(yùn)行結(jié)果如下:try…except…舉例8/39Python中,可以通過在關(guān)鍵字except后添加異常的類型以捕獲不同類型的異常,從而執(zhí)行不同的語句塊,具體的語法格式如下:try:

語句塊1except異常1:

語句塊2[except異常2:語句塊3…][except:

語句塊n]在except關(guān)鍵字后添加異常的類型9/39如果構(gòu)造上述結(jié)構(gòu)的異常處理程序,當(dāng)關(guān)鍵字try引導(dǎo)的語句塊1發(fā)生異常時,將逐一搜索關(guān)鍵字except引導(dǎo)的異常類型,如果產(chǎn)生的錯誤與except引導(dǎo)的異常類型匹配,則運(yùn)行對應(yīng)的語句塊,否則運(yùn)行沒有指定異常類型的except關(guān)鍵字所包含的語句塊n。特別注意,沒有指定異常類型的except和其引導(dǎo)的語句塊n必須放在該結(jié)構(gòu)的最后,例如:特定類型異常的捕獲10/39在構(gòu)建包含異常處理機(jī)制的程序結(jié)構(gòu)時,還可以在其中添加以關(guān)鍵字else引導(dǎo)的部分,其語法格式如下:try:

語句塊1except異常1:

語句塊2[except異常2:語句塊3…][except:

語句塊n][else:

語句塊e]異常處理中的else…語句11/39由關(guān)鍵字else引導(dǎo)的語句,將會在try引導(dǎo)的語句塊沒有產(chǎn)生任何異常時被運(yùn)行。例如,在例7_3中加入else引導(dǎo)的語句塊,可以得到如下程序:在異常處理中添加else分支12/39在構(gòu)建包含異常處理機(jī)制的程序結(jié)構(gòu)時,還可以在其中添加以關(guān)鍵字finally引導(dǎo)的部分,其語法格式如下:try:

語句塊1except異常1:

語句塊2[except異常2:語句塊3…][except:

語句塊n][else:

語句塊e][finally:

語句塊f]異常處理中的finally…語句13/39由關(guān)鍵字finally引導(dǎo)的語句塊放在整個結(jié)構(gòu)的最后,無論之前由關(guān)鍵字try引導(dǎo)的語句塊有沒有發(fā)生異常,程序最后都會去運(yùn)行由關(guān)鍵字finally引導(dǎo)的語句塊,finally引導(dǎo)的程序程序一般會用來釋放try語句塊中已運(yùn)行程序所占用的各類計算機(jī)資源,防止由于計算機(jī)資源耗盡而導(dǎo)致整個計算機(jī)系統(tǒng)崩潰。例如,在例7_3中加入finally引導(dǎo)的語句塊,可以得到如下程序:在異常處理中添加finally分支14/39通過之前的學(xué)習(xí)可以知道,由關(guān)鍵字try引導(dǎo)的語句塊在運(yùn)行時如果遇到異常,Python會隱藏默認(rèn)的錯誤信息,取而代之的是去執(zhí)行由except關(guān)鍵字引導(dǎo)的語句塊。顯然,這樣做的好處是程序的使用者無需面對晦澀難懂的錯誤信息,可是對于程序員來說看不到程序的錯誤信息就無法對程序進(jìn)行有效的糾錯,此時需要使用raise語句主動將錯誤信息輸出在屏幕中,其語法格式如下:raise[異常對象]如果raise語句中沒有指定的異常對象,raise會重新引發(fā)當(dāng)前作用域內(nèi)最后一個激活的異常。例如,在例7_3中except引導(dǎo)的語句塊中加入raise語句,可以得到如下程序(見下頁):異常處理中的raise語句15/39上述程序的運(yùn)行結(jié)果如下:raise語句舉例16/39第7章異常處理與文件操作7.2斷言與assert語句斷言是Python提供給程序員的另外一個強(qiáng)大的錯誤調(diào)試工具,所謂斷言,就是通過對程序員指定的表達(dá)式進(jìn)行邏輯值判定,如果表達(dá)式的運(yùn)算結(jié)果為True則程序不采取任何措施,否則觸發(fā)AssertionError即斷言異常,assert語句的語法格式如下:assert斷言表達(dá)式如果斷言表達(dá)式的運(yùn)算結(jié)果為False,就會產(chǎn)生AssertionError異常,該異??梢员徊东@并處理;如果斷言表達(dá)式的值為True,則不采取任何措施。例如例7_7中包含的assert語句中的斷言表達(dá)式的值均為True,所以程序不會產(chǎn)生任何異常。斷言表達(dá)式18/39斷言表達(dá)式舉例19/39在實(shí)際的計算過程中,往往對用戶輸入的數(shù)據(jù)有一定的要求,比如在計算三角形的面積時,需要先判定三條邊的數(shù)值是否滿足構(gòu)成三角形的條件,此時我們就可以在程序中使用斷言來判定該條件是否成立,例如:運(yùn)行結(jié)果見下頁斷言的應(yīng)用舉例20/39上述程序在計算三角形面積之前,會先去檢驗(yàn)assert語句中的斷言表達(dá)式是否成立,如果輸入的數(shù)據(jù)不滿足構(gòu)成三角形的條件,則會產(chǎn)生斷言異常,例如:否則,如果輸入的數(shù)據(jù)滿足了構(gòu)成三角形的條件,程序就可以正常運(yùn)行,例如:斷言的應(yīng)用舉例(續(xù))21/39為了讓程序例7_9具有更友好的錯誤提示,可以在其中引入異常處理機(jī)制,例如:對斷言異常的處理22/39第7章異常處理與文件操作7.3文件操作文件是計算機(jī)中用來長期保存數(shù)據(jù)的容器,文件中可以存儲很多不同類型的數(shù)據(jù),包括文字、圖片、音樂、計算機(jī)程序、電話號碼表等類型的數(shù)據(jù)都可以存在文件里面。為了能夠達(dá)到長期保存數(shù)據(jù)的目的,文件在不被使用的時候,是存放在外存儲器中的,只有需要使用文件中數(shù)據(jù)的時候,文件才會被計算機(jī)讀取到內(nèi)存中,并且在使用完畢后,還需要將外存儲器中的文件內(nèi)容更新至與內(nèi)存中的最新狀態(tài)一致。大多數(shù)操作系統(tǒng)的文件名包含兩個部分,在文件名中通常用一個點(diǎn)(.)進(jìn)行分隔,點(diǎn)之前的部分用于區(qū)分文件對象,被稱為主文件名,點(diǎn)后面的部分用于表示文件的類型,被稱為文件的擴(kuò)展名。為了找到外存儲器中文件所處的位置而經(jīng)歷的一系列文件夾序列稱為路徑,如C:/Windows/regedit.exe和D:/python/chapter7/data.txt等文件位置的描述都包含了正確的文件路徑信息,其中,.exe和.txt表示文件的擴(kuò)展名,分別表示regedit.exe是一個可執(zhí)行文件,而data.txt是一個文本文件。計算機(jī)中的文件24/39在知道文件所在位置的路徑和文件名之后,便可以對文件進(jìn)行相應(yīng)的操作,完整的文件操作一般包括如下幾步:(1)打開文件。(2)讀取文件中的數(shù)據(jù)或?qū)⒅付ǖ臄?shù)據(jù)寫入文件。(3)關(guān)閉文件。上述步驟表示:在操作文件對象之前,必須先打開文件,然后再進(jìn)行文件的讀寫操作,最后還必須關(guān)閉文件,以釋放對文件的占用,讓其他的程序能夠?qū)ζ溥M(jìn)行正常訪問。其中,讀取文件中數(shù)據(jù)的操作和將指定的數(shù)據(jù)寫入文件的操作是最主要的文件操作,在接下來的章節(jié)中分別進(jìn)行介紹。一般的文件處理操作步驟25/39通過內(nèi)置函數(shù)open()可以完成打開文件的操作,其語法格式如下:open(file,mode='r',encoding=None)其中,open()函數(shù)的第一個參數(shù)file用于指定文件的所在位置,即文件的路徑和文件名,如果省略文件路徑,則表示操作的文件與當(dāng)前程序文件在同一個文件夾下,第二個參數(shù)mode用于指定打開文件的模式,第三個參數(shù)encoding表示文本文件的編碼方式。常見的用于指定文件打開模式的字符有:'r':代表以讀取模式打開文件,若指定的文件不存在,則會引發(fā)程序錯誤;'r+':代表對'r'模式增加了寫入數(shù)據(jù)的能力;'w':代表以寫入模式打開文件,該模式將抹去已有文件中之前的內(nèi)容,若指定的文件不存在,則會在該位置創(chuàng)建新文件;'w+':代表對'w'模式增加了讀取數(shù)據(jù)的能力;打開文件對象26/39'x':代表以排他性創(chuàng)建文件的寫入模式打開文件,所謂排他性創(chuàng)建指的是參數(shù)file指定的文件之前必須不存在,如果已經(jīng)存在則會引發(fā)程序錯誤;'x+':代表對'x'模式增加了讀取數(shù)據(jù)的能力;'a':代表以追加寫入模式打開文件,追加的內(nèi)容會放置在文件末尾;'a+':代表對'a'模式增加了讀取數(shù)據(jù)的能力;'t':代表以文本模式打開文件,即讀取和寫入的內(nèi)容都是字符串?dāng)?shù)據(jù);'b':代表以二進(jìn)制模式打開文件,即讀取和寫入的內(nèi)容都是二進(jìn)制數(shù)據(jù)。open()函數(shù)被調(diào)用時,如果沒有指定是使用文本模式't'還是二進(jìn)制模式'b'打開文件,默認(rèn)都是使用文本模式't'打開文件對象。打開文件對象(續(xù))27/39一個文件在程序中被打開,我們也稱該文件被這段程序占用,此時如果其他程序也來操作同一個文件,會造成操作沖突,因此在程序中不再需要操作文件對象時,需要及時將其關(guān)閉,關(guān)閉文件的方法是使用文件對象的close()方法,該方法的語法格式如下:file.close()其中,變量file指的是已打開的文件對象,程序例7_11中包含了打開和關(guān)閉文件的程序示例。關(guān)閉文件對象28/3929/39打開文件后,使用文件對象的write()方法即可進(jìn)行數(shù)據(jù)的寫入操作,該方法的語法格式如下:file.write(s)其中,參數(shù)s表示即將寫入文件中的數(shù)據(jù)內(nèi)容。程序例7_12演示了一個打開文件、寫文件、關(guān)閉文件的完整示例。寫入文件內(nèi)容30/39若要對程序例7_12運(yùn)行后產(chǎn)生的animal.txt文件中的內(nèi)容進(jìn)行追加,我們可以使用如下程序:上述程序以追加模式'a'打開文件,程序運(yùn)行后會在文件“animal.txt”的末尾追加三行新的字符串?dāng)?shù)據(jù),即“Horse”、“Cow”和“Sheep”。與寫入模式'w'類似,以追加模式'a'打開文件時,如果被打開的文件不存在,則會在該位置創(chuàng)建文件。追加文件內(nèi)容31/39為了讀取上一節(jié)中寫入文件中的數(shù)據(jù),在打開文件時,需要指定oepn()函數(shù)的參數(shù)為打開模式'r'。打開文件后可以使用文件對象的read()方法讀取文件內(nèi)容,該方法的語法格式如下:file.read(size=-1)其中,參數(shù)size表示從文件中讀取的字符個數(shù),如果沒有指定,則表示讀取文件中的所有內(nèi)容,如果read()方法的返回內(nèi)容為空字符串,表示文件中已經(jīng)沒有數(shù)據(jù)可以讀取,例如:讀取文件內(nèi)容32/39對于文本文件,除了使用文件對象的read()方法以外,還可以用readline()方法和readlines()方法讀取文件中的內(nèi)容,這兩個方法的語法格式如下:file.readline()和file.readlines()文件對象的readline()方法表示從文件中讀取一行,當(dāng)該方法的返回內(nèi)容為空字符串時,表示文件中已經(jīng)沒有數(shù)據(jù)可以讀取,例如:讀取文件內(nèi)容(續(xù))33/39文件對象的readlines()方法表示以列表的形式返回文件中的所有行,例如:運(yùn)行結(jié)果如下:觀察程序的運(yùn)行結(jié)果可知,文件對象的readlines()方法將讀取文件中的所有行,并返回一個列表對象,其中的每一個元素就是文件中的一行文本。與readline()方法類似,每行文本之后依然會保留原始數(shù)據(jù)中的換行符'\n'。讀取文件內(nèi)容(續(xù))34/39同時,由于文件對象本身也是一個可迭代對象,如果希望以最簡單的方式對文件中的內(nèi)容進(jìn)行迭代,可以直接構(gòu)造迭代循環(huán)對文件對象進(jìn)行遍歷,此時循環(huán)變量對應(yīng)的就是文件中的每一行文本,例如:對文件對象迭代35/39在編寫有關(guān)文件讀取的程序時,如果在讀寫過程中產(chǎn)生了錯誤,將會導(dǎo)致程序不能及時將打開的文件關(guān)閉,例如:由于上述程序在進(jìn)行36/0的運(yùn)算過程中會產(chǎn)生除數(shù)為0的錯誤,這將導(dǎo)致程序立刻停止運(yùn)行。顯然,之后的文件關(guān)閉語句file.close()也沒有被運(yùn)行,這就意味著在該程序中打開的文件對象沒有被正確關(guān)閉,如果此時有其他程序也要對該文件進(jìn)行操作就會引發(fā)錯誤,帶來一系列的不良后果。資源對象需要在程序中正確關(guān)閉36/39為了解決上述問題,可以在例7_18的程序中引入異常處理機(jī)制,無論程序是否遇到了錯誤都必須保證文件對象被正確關(guān)閉,例如:使用異常處理機(jī)制解決上述問題37/39Python語言為了簡化上述程序,提出了上下文管理器機(jī)制,即由Python幫助程序員管理程序中的各種資源,無需程序員構(gòu)造相應(yīng)的關(guān)閉資源對象的語句。為了定義上下文管理器,需要使用with關(guān)鍵字,其語法格式如下:with資源對象[as別名]:

語句塊使用上下文管理器對例7_19的程序進(jìn)行改造,程序如下:上下文管理器與with語句38/39第7章異常處理與文件操作7.4本章小結(jié)本章介紹了異常處理、斷言、文件處理

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論