異常處理及程序調(diào)試課件_第1頁
異常處理及程序調(diào)試課件_第2頁
異常處理及程序調(diào)試課件_第3頁
異常處理及程序調(diào)試課件_第4頁
異常處理及程序調(diào)試課件_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2022/11/221Python語言編程導(dǎo)論第十章異常處理與程序調(diào)試2022/10/111Python語言編程導(dǎo)論第十章異常內(nèi)容提要概述異常的處理調(diào)試使用自帶IDEL調(diào)試程序2022/11/222內(nèi)容提要概述2022/10/112一、概述在程序執(zhí)行過程中,遇到出錯情況在所難免。有些錯誤可以預(yù)料,可在程序處理中考慮進(jìn)去;有些錯誤是意料之外的,例如,若在讀取文件其間,計算機(jī)上的其他程序已將其刪除,如何處理?若程序從網(wǎng)站下載網(wǎng)頁時,該網(wǎng)站突然崩潰,如何處理?Python采用的措施是引發(fā)異常。異常是一種特殊的錯誤對象,程序可以捕獲并檢查它們,以決定如何處理錯誤。異常可能改變程序的控制流程。根據(jù)發(fā)生的時機(jī),異常可能導(dǎo)致執(zhí)行流程跳出函數(shù)或進(jìn)入處理錯誤的代碼塊。通常,我們無法確定哪一行可能引發(fā)異常,Python提供了一個特殊的異常處理結(jié)構(gòu),可用于捕獲異常,并確保無論是否出現(xiàn)異常都將執(zhí)行清理代碼。2022/11/223一、概述在程序執(zhí)行過程中,遇到出錯情況在所難免。有些錯誤可以常見的異常類型:SyntaxError:Python不能理解程序NameError:局部或全局變量名找不到AttributeError:屬性引用失敗IndexError:索引引用越界TypeError:操作數(shù)的類型不正確ValueError:操作數(shù)類型正確,但值非法ZeroDivisionError:被零除FileNotFoundError:文件未找到IOError:IOsystem報告故障2022/11/224常見的異常類型:SyntaxError:Python不能理例如:試圖存取列表上界之外的元素將引發(fā)IndexError如:Test=[1,2,3]Test[4]試圖轉(zhuǎn)換不適當(dāng)?shù)念愋蛯⒁l(fā)TypeError如:int(Test)引用不存在的變量將引發(fā)NameError如:a不同的數(shù)據(jù)類型參加運(yùn)算而沒有強(qiáng)制類型轉(zhuǎn)換將引發(fā)TypeError如:‘a(chǎn)’/42022/11/225例如:試圖存取列表上界之外的元素將引發(fā)IndexError2如何處理異常?什么都不做:替換成缺省值,使程序繼續(xù)執(zhí)行Badidea!用戶可能會懷疑結(jié)果返回一個“error”值選擇一個什么樣的錯誤值?主調(diào)程序必須包含檢查這種特殊值和處理一系列錯誤的代碼停止執(zhí)行,發(fā)出錯誤條件信號在Python中即引發(fā)異常,捕獲異常并處理之2022/11/226如何處理異常?什么都不做:替換成缺省值,使程序繼續(xù)執(zhí)行202例9-1:傳統(tǒng)處理程序出錯及Python處理異常比較編寫函數(shù)getRatios(v1,v2)。假定參數(shù)v1、v2是等長的數(shù)字列表,要求返回一個列表,該列表包含v1[i]/v2[i]有意義的值。2022/11/227例9-1:傳統(tǒng)處理程序出錯及Python處理異常比較編寫函數(shù)使用傳統(tǒng)程序設(shè)計方法處理錯誤:2022/11/228使用傳統(tǒng)程序設(shè)計方法處理錯誤:2022/10/118調(diào)用及執(zhí)行:2022/11/229調(diào)用及執(zhí)行:2022/10/119使用Python異常處理機(jī)制實(shí)現(xiàn):2022/11/2210執(zhí)行:使用Python異常處理機(jī)制實(shí)現(xiàn):2022/10/1110執(zhí)對比之下,傳統(tǒng)處理錯誤方法的缺點(diǎn)顯而易見:程序難讀,因此難以維護(hù)和修改效率較低2022/11/2211對比之下,傳統(tǒng)處理錯誤方法的缺點(diǎn)顯而易見:程序難讀,因此難以二、異常的處理1、try…except的使用try…except語句用于處理問題語句,捕獲可能出現(xiàn)的異常。try子句中的代碼塊放置可能出現(xiàn)異常的語句,except子句中的代碼塊處理異常。當(dāng)異常出現(xiàn)時,Python會自動生成1個異常對象,該對象包括異常的具體信息,以及異常的種類和錯誤位置。2022/11/2212二、異常的處理1、try…except的使用2022/10/例如:試圖打開不存在的文件2022/11/2213說明:出現(xiàn)了FileNotFoundError異常例如:試圖打開不存在的文件2022/10/1113說明:出現(xiàn)例9-2:使用try…except捕獲FileNotFoundError異常2022/11/2214執(zhí)行結(jié)果:例9-2:使用try…except捕獲FileNotFoun又如:2022/11/2215同樣可以使用try…except語句來處理該異常。try…except語句后還可以添加1個else子句,當(dāng)try子句中的代碼發(fā)生異常時,程序直接跳轉(zhuǎn)到except子句;反之,程序?qū)?zhí)行else子句。又如:2022/10/1115同樣可以使用try…excep例9-3:捕獲并處理除數(shù)為0的ZeroDivisionError異常2022/11/2216執(zhí)行結(jié)果:例9-3:捕獲并處理除數(shù)為0的ZeroDivisionErr例9-4:異常處理的嵌套2022/11/2217執(zhí)行結(jié)果:例9-4:異常處理的嵌套2022/10/1117執(zhí)行結(jié)果:2、try…finally的使用try…except語句還可以添加1個finally子句,無論異常是否發(fā)生,finally子句都會被執(zhí)行。finally子句通常用于關(guān)閉因異常而不能釋放的系統(tǒng)資源。2022/11/22182、try…finally的使用try…except語句還可例9-5:使用try…finally處理異常2022/11/2219例9-5:使用try…finally處理異常2022/10/執(zhí)行情況:2022/11/2220執(zhí)行情況:2022/10/1120課堂練習(xí)一:課堂練習(xí)一2022/11/2221課堂練習(xí)一:課堂練習(xí)一2022/10/11213、使用raise拋出異常當(dāng)程序中出現(xiàn)錯誤時,Python會自動引發(fā)異常。另外,在程序的任何地方都可以使用raise語句故意引發(fā)異常。一旦執(zhí)行了raise語句,raise語句后的代碼將不被執(zhí)行。raise語句通常用于拋出自定義異常,因?yàn)樽远x異常并不在Python的控制范圍之內(nèi),不會被Python自動拋出,應(yīng)使用raise語句手工拋出。2022/11/22223、使用raise拋出異常當(dāng)程序中出現(xiàn)錯誤時,Python會例9-6:使用raise拋出異常2022/11/2223執(zhí)行結(jié)果:例9-6:使用raise拋出異常2022/10/1123執(zhí)行4、自定義異常Python允許自定義異常,用于描述Python異常體系中沒有涉及的異常情況。自定義異常必須繼承Exception類。自定義異常按照命名規(guī)范以Error結(jié)尾,顯式地表示該類是異常類。自定義異常使用raise語句引發(fā),且只能通過手工方式觸發(fā)。2022/11/22244、自定義異常Python允許自定義異常,用于描述Pytho例9-7:自定義異常2022/11/2225執(zhí)行結(jié)果:例9-7:自定義異常2022/10/1125執(zhí)行結(jié)果:5、assert語句的使用assert語句用于檢測某個條件表達(dá)式是否為真。assert語句又稱為斷言語句,即assert認(rèn)為檢測的表達(dá)式永遠(yuǎn)為真。if語句中的條件判斷都可以使用assert語句檢測。例如,檢測某個元組中元素的個數(shù)是否大于1,如果assert語言斷言失敗,會引發(fā)AssertionError異常。2022/11/22265、assert語句的使用assert語句用于檢測某個條件表例9-8:assert語句使用2022/11/2227執(zhí)行結(jié)果:例9-8:assert語句使用2022/10/1127執(zhí)行結(jié)在何處使用斷言?使用斷言的目的是為了盡早識別bug且清楚它們是在何處出現(xiàn)的在第一次碰到問題時就捕獲它,使調(diào)試更容易,而不是之后再追蹤不要將斷言用于測試之處,但可以作為測試的補(bǔ)充若用戶提供了錯誤輸入時應(yīng)盡可能依靠拋出異常去處理,而斷言常用于檢查參數(shù)或值的類型。2022/11/2228在何處使用斷言?使用斷言的目的是為了盡早識別bug且清楚它們6、多種異常的處理可在except子句中指定多種異常來處理多種異常;如果要分別處理不同的異常,可使用多個except子句;如果在except子句中沒有指定異常,它將捕獲所有異常。2022/11/22296、多種異常的處理可在except子句中指定多種異常來處理多例9-9:處理多種異常2022/11/2230例9-9:處理多種異常2022/10/1130執(zhí)行結(jié)果:2022/11/2231執(zhí)行結(jié)果:執(zhí)行結(jié)果:2022/10/1131執(zhí)行結(jié)果:課堂練習(xí)二:課堂練習(xí)二2022/11/2232課堂練習(xí)二:課堂練習(xí)二2022/10/1132三、調(diào)試如果總能寫出正確的代碼,并在第一次第一次測試時就能正確執(zhí)行,當(dāng)然很好。但實(shí)際編程過程中并不總是如此順利。如何測試代碼是否正確,常用的方法有:黑盒測試—通過特定規(guī)范執(zhí)行路徑白盒測試—通過代碼執(zhí)行路徑將調(diào)試作為一個搜索過程—使用二分查找的方法,分離并檢查錯誤來源2022/11/2233三、調(diào)試如果總能寫出正確的代碼,并在第一次第一次測試時就能正1、測試和調(diào)試在調(diào)試程序過程中我們需要一些方法:測試方法—使用不同的例子運(yùn)行代碼看其是否正確的方法調(diào)試方法—已經(jīng)發(fā)現(xiàn)程序中有問題,如何修正程序的方法2022/11/22341、測試和調(diào)試在調(diào)試程序過程中我們需要一些方法:2022/1何時進(jìn)行測試?何時進(jìn)行調(diào)試?實(shí)際上,如果我們能弄清楚如何設(shè)計代碼,那么測試和調(diào)試會更加簡單。優(yōu)秀的程序員會有這樣的經(jīng)驗(yàn):將代碼分解成獨(dú)立的模塊,從而獨(dú)立地測試和調(diào)試;寫出好的文檔(寫明輸入、輸出的期望是什么;即使代碼沒有執(zhí)行對測試的限制,這種文檔也是有價值的);記錄下可能的各種假設(shè);2022/11/2235何時進(jìn)行測試?何時進(jìn)行調(diào)試?實(shí)際上,如果我們能弄清楚如何設(shè)計測試之前要完成的工作:確保代碼可以運(yùn)行剔除語法錯誤剔除靜態(tài)語義錯誤事實(shí)上,Python解釋器可以自動處理上述兩種錯誤準(zhǔn)備一套預(yù)期結(jié)果(即對于一個特定的輸入,期待會有怎樣的輸出)2022/11/2236測試之前要完成的工作:確保代碼可以運(yùn)行2022/10/1132、測試套件我們希望找到一系列輸入,它們很有可能暴露錯誤,且不會花太多時間,但卻十分有效,這就是所謂測試套件。將輸入分解為子集,為代碼正確性提供等效信息;構(gòu)造測試套件,其中至少包含每個子集的一個元素;運(yùn)行測試套件。2022/11/22372、測試套件我們希望找到一系列輸入,它們很有可能暴露錯誤,且例9-10:測試套件應(yīng)用輸入空間是所有的整數(shù)對可能的子集:x為正,y為正x為負(fù),y為負(fù)x為正,y為負(fù)x為負(fù),y為正x=0,y=0x=0,y!=0x!=0,y=02022/11/2238例9-10:測試套件應(yīng)用輸入空間是所有的整數(shù)對2022/10輸入空間的劃分原則:上例中當(dāng)然也可以有其他的輸入選擇,例如x是質(zhì)數(shù),y不是;y是質(zhì)數(shù),x不是;x和y都是質(zhì)數(shù);x和y都不是質(zhì)數(shù)。但這與問題不相關(guān)。實(shí)際上輸入空間經(jīng)常具有自然邊界:如:整數(shù)有正、負(fù)、零值;根據(jù)這個觀點(diǎn)可以將測試數(shù)據(jù)劃分為9個子集(見上頁):將x=0,y!=0劃分為x=0,y為正數(shù)和x=0,y為負(fù)數(shù)x!=0,y=0也同樣劃分2022/11/2239輸入空間的劃分原則:上例中當(dāng)然也可以有其他的輸入選擇,例如x測試方法:隨機(jī)測試—代碼的正確率隨測試次數(shù)的增加而增加;黑盒測試:在測試時,把程序看作一個不能打開的黑盒子,在完全不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性的情況下,測試者在程序接口進(jìn)行測試,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當(dāng)?shù)亟邮蘸驼_的輸出白盒測試:是通過程序的源代碼進(jìn)行測試而不使用用戶界面。這種類型的測試需要從代碼句法發(fā)現(xiàn)內(nèi)部代碼在算法,溢出,路徑,條件等等中的缺點(diǎn)或者錯誤,進(jìn)而加以修正。2022/11/2240測試方法:隨機(jī)測試—代碼的正確率隨測試次數(shù)的增加而增加;203、黑盒測試測試套件的設(shè)計使人們無需查看代碼,其優(yōu)點(diǎn)為:編程者以外的其他人也可以使用其進(jìn)行測試;可以避免編程者潛在的偏見,使得發(fā)現(xiàn)錯誤更為容易;同一個測試套件可以被重復(fù)利用,即使改變了程序代碼。2022/11/22413、黑盒測試測試套件的設(shè)計使人們無需查看代碼,其優(yōu)點(diǎn)為:204、白盒測試使用代碼本身引導(dǎo)測試用例的設(shè)計;一個好的白盒測試套件,也被稱為窮舉路徑測試,代碼片段的每一個路徑至少都被檢測一次;當(dāng)然,即使是一個窮舉路徑測試也可能遺漏錯誤,這取決于例子的選擇。2022/11/22424、白盒測試使用代碼本身引導(dǎo)測試用例的設(shè)計;2022/10/例9-11:求某個數(shù)的絕對值(使用白盒測試)選擇測試套件{-2,2},這是窮舉路徑;但是遺漏了檢測abs(-1);測試的邊界應(yīng)該選擇{-2,-1,2}修改程序(ifx<=-1)2022/11/2243例9-11:求某個數(shù)的絕對值(使用白盒測試)選擇測試套件{-白盒測試的經(jīng)驗(yàn)法則:執(zhí)行所有if語句的兩條分支;確保每一個except語句被執(zhí)行;對于每一個for循環(huán),需要測試以下情況:循環(huán)一次都未被執(zhí)行;循環(huán)體只被執(zhí)行一次;循環(huán)體被執(zhí)行一次以上對于每一個while循環(huán),需要測試以下情況:與for循環(huán)測試相同還要測試所有退出循環(huán)的情況對于遞歸,要測試沒有遞歸、有一次遞歸和多次遞歸的情況。2022/11/2244白盒測試的經(jīng)驗(yàn)法則:執(zhí)行所有if語句的兩條分支;2022/15、將二分查找思路用于調(diào)試?yán)?-12:用二分查找思路調(diào)試判回文程序。2022/11/2245執(zhí)行情況:5、將二分查找思路用于調(diào)試?yán)?-12:用二分查找思路調(diào)試判回2022/11/2246執(zhí)行情況:錯誤肯定在此之前2022/10/1146執(zhí)行情況:錯誤肯定在此之前2022/11/2247執(zhí)行情況:說明silly(n)已經(jīng)沒問題,再去看isPal(x)2022/10/1147執(zhí)行情況:說明silly(n)已經(jīng)沒2022/11/2248錯誤肯定在此之前執(zhí)行情況:2022/10/1148錯誤肯定在此之前執(zhí)行情況:2022/11/2249執(zhí)行情況:說明錯誤在此之前2022/10/1149執(zhí)行情況:說明錯誤在此之前2022/11/2250執(zhí)行情況:應(yīng)將x的副

溫馨提示

  • 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

提交評論