《大數(shù)據(jù)的Python基礎(chǔ)》課件-第8章 異常處理與程序調(diào)試_第1頁(yè)
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第8章 異常處理與程序調(diào)試_第2頁(yè)
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第8章 異常處理與程序調(diào)試_第3頁(yè)
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第8章 異常處理與程序調(diào)試_第4頁(yè)
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第8章 異常處理與程序調(diào)試_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章異常處理與程序調(diào)試學(xué)習(xí)目標(biāo)了解異常的概念

掌握捕獲指定異常、自定義異常

掌握斷言及上下文管理熟悉使用IDLE、pdb調(diào)試代碼22025/3/68.1異常的概念

異常是指程序運(yùn)行時(shí)引發(fā)的錯(cuò)誤,如:除零、下標(biāo)越界、文件不存在、網(wǎng)絡(luò)異常、類型錯(cuò)誤、磁盤空間不足等等。32025/3/6>>>x,y=3,4>>>printf(x+y)NameError:name'printf'isnotdefined>>>print(x/0)ZeroDivisionError:divisionbyzero>>>'3'+2TypeError:mustbestr,notint>>>'3'+str(2) #正確的寫法'32'>>>eval('3')+2 #正確的寫法58.1異常的概念42025/3/6異常名稱描述BaseException所有異常的基類SystemExit解釋器請(qǐng)求退出KeyboardInterrupt用戶中斷執(zhí)行(通常是輸入^C)Exception常規(guī)錯(cuò)誤的基類StopIteration迭代器沒有更多的值GeneratorExit生成器(generator)發(fā)生異常來通知退出StandardError所有的內(nèi)建標(biāo)準(zhǔn)異常的基類ArithmeticError所有數(shù)值計(jì)算錯(cuò)誤的基類FloatingPointError浮點(diǎn)計(jì)算錯(cuò)誤OverflowError數(shù)值運(yùn)算超出最大限制ZeroDivisionError除(或取模)零(所有數(shù)據(jù)類型)AssertionError斷言語句失敗AttributeError對(duì)象沒有這個(gè)屬性8.1異常的概念52025/3/6EOFError沒有內(nèi)建輸入,到達(dá)EOF標(biāo)記EnvironmentError操作系統(tǒng)錯(cuò)誤的基類IOError輸入/輸出操作失敗OSError操作系統(tǒng)錯(cuò)誤WindowsError系統(tǒng)調(diào)用失敗ImportError導(dǎo)入模塊/對(duì)象失敗LookupError無效數(shù)據(jù)查詢的基類IndexError序列中沒有此索引(index)KeyError映射中沒有這個(gè)鍵MemoryError內(nèi)存溢出錯(cuò)誤(對(duì)于Python解釋器不是致命的)NameError未聲明/初始化對(duì)象(沒有屬性)UnboundLocalError訪問未初始化的本地變量ReferenceError弱引用(Weakreference)試圖訪問已經(jīng)垃圾回收了的對(duì)象8.1異常的概念62025/3/6RuntimeError一般的運(yùn)行時(shí)錯(cuò)誤NotImplementedError尚未實(shí)現(xiàn)的方法SyntaxErrorPython語法錯(cuò)誤IndentationError縮進(jìn)錯(cuò)誤TabErrorTab和空格混用SystemError一般的解釋器系統(tǒng)錯(cuò)誤TypeError對(duì)類型無效的操作ValueError傳入無效的參數(shù)UnicodeErrorUnicode相關(guān)的錯(cuò)誤UnicodeDecodeErrorUnicode解碼時(shí)的錯(cuò)誤UnicodeEncodeErrorUnicode編碼時(shí)錯(cuò)誤UnicodeTranslateErrorUnicode轉(zhuǎn)換時(shí)錯(cuò)誤8.1異常的概念72025/3/6Warning警告的基類DeprecationWarning關(guān)于被棄用的特征的警告FutureWarning關(guān)于構(gòu)造將來語義會(huì)有改變的警告OverflowWarning舊的關(guān)于自動(dòng)提升為長(zhǎng)整型(long)的警告PendingDeprecationWarning關(guān)于特性將會(huì)被廢棄的警告RuntimeWarning可疑的運(yùn)行時(shí)行為(runtimebehavior)的警告SyntaxWarning可疑的語法的警告UserWarning用戶代碼生成的警告8.2異常捕獲82025/3/6關(guān)鍵字說明try/except捕獲異常并處理pass忽略異常as定義異常實(shí)例(exceptMyErrorase)else如果try中的語句沒有引發(fā)異常,則執(zhí)行else中的語句finally無論是否出現(xiàn)異常,都執(zhí)行的代碼raise拋出/引發(fā)異常8.2.1捕獲指定異常

捕獲指定的異常是異常處理的基本形式,采用try...except結(jié)構(gòu)。92025/3/6try:<執(zhí)行的語句>except<異常名>[as別名]:<出現(xiàn)異常時(shí)執(zhí)行的語句>這里的異常名如果省略,則成為:try:<執(zhí)行的語句>except:<出現(xiàn)異常時(shí)執(zhí)行的語句>8.2.2

沒有出現(xiàn)指定異常的處理如果判斷完沒有某些異常之后還想做其他事,可以在使用異常之后添加else語句,形成try...except...else語句。102025/3/6a_list=['0.預(yù)覽','1.查詢','2.保存','3.打印']whileTrue:n=input('請(qǐng)輸入菜單的序號(hào){}:'.format(a_list))try:print(a_list[eval(n)])exceptIndexError:print('列表元素的下標(biāo)越界,請(qǐng)重新輸入字符串的序號(hào)')else:print('沒有異常')8.2.2沒有出現(xiàn)指定異常的處理112025/3/6請(qǐng)輸入菜單的序號(hào)['0.預(yù)覽','1.查詢','2.保存','3.打印']:00.預(yù)覽沒有異常請(qǐng)輸入菜單的序號(hào)['0.預(yù)覽','1.查詢','2.保存','3.打印']:7列表元素的下標(biāo)越界,請(qǐng)重新輸入字符串的序號(hào)請(qǐng)輸入菜單的序號(hào)['0.預(yù)覽','1.查詢','2.保存','3.打印']:8.2.3

捕獲多個(gè)異常

在實(shí)際開發(fā)中,同一段代碼可能會(huì)拋出多個(gè)異常,需要針對(duì)不同的異常類型進(jìn)行相應(yīng)的處理。122025/3/6try:

try:<執(zhí)行的語句>

<執(zhí)行的語句>exceptException1:<出現(xiàn)異常1時(shí)執(zhí)行的語句>

except(Exception1,Exception2,…):

<出現(xiàn)異常時(shí)執(zhí)行的語句>exceptException2:<出現(xiàn)異常2時(shí)執(zhí)行的語句>

8.2.3捕獲多個(gè)異常132025/3/6try:x=input('請(qǐng)輸入被除數(shù):')y=input('請(qǐng)輸入除數(shù):')z=float(x)/float(y)exceptZeroDivisionError:print('除數(shù)不能為零')exceptValueError:print('被除數(shù)和除數(shù)應(yīng)為數(shù)值類型')else: print(x,'/',y,'=',z)8.2.4

帶有finally的異常處理在try...except...finally結(jié)構(gòu)中,finally子句中的語句塊無論是否發(fā)生異常都會(huì)執(zhí)行。常用來做一些清理工作以釋放try子句中申請(qǐng)的資源。142025/3/6try: <執(zhí)行的語句>except<異常名>[as別名]: <出現(xiàn)異常時(shí)執(zhí)行的語句>finally: <無論如何都會(huì)執(zhí)行的代碼>8.2.4帶有finally的異常處理使用帶有finally子句的異常處理結(jié)構(gòu)時(shí),應(yīng)盡量避免在finally子句中使用return語句,否則可能會(huì)出現(xiàn)出乎意料的錯(cuò)誤。152025/3/6>>>defdemo_div(a,b):try: returna/bexcept: passfinally: return-1 >>>demo_div(1,0)-1>>>demo_div(1,2)-18.3自定義異常程序運(yùn)行的過程中出現(xiàn)了錯(cuò)誤,如果沒有對(duì)錯(cuò)誤進(jìn)行不過處理,Python的解釋器就會(huì)終止運(yùn)行,并且拋出錯(cuò)誤。在引發(fā)異常時(shí),應(yīng)該選擇合適的異常類,從而可以明確地描述該異常情況。162025/3/68.3自定義異常程序運(yùn)行的過程中出現(xiàn)了錯(cuò)誤,如果沒有對(duì)錯(cuò)誤進(jìn)行不過處理,Python的解釋器就會(huì)終止運(yùn)行,并且拋出錯(cuò)誤。在引發(fā)異常時(shí),應(yīng)該選擇合適的異常類,從而可以明確地描述該異常情況。172025/3/68.3.1主動(dòng)拋出異常

在程序設(shè)計(jì)中可以根據(jù)需要自行設(shè)置異常觸發(fā)條件,并使用raise語句定義和拋出異常。其語法是:raiseException(args)

語句中Exception是異常的類型(例如ValueError),args是可選的異常參數(shù)值,如果不提供,異常的參數(shù)是"None"。182025/3/68.3.1主動(dòng)拋出異常192025/3/6importtraceback deffun(level): iflevel<1: raiseException('參數(shù)錯(cuò)誤') try: fun(0) exceptExceptionase: traceback.print_exc() print(e) else: print('沒有錯(cuò)誤')運(yùn)行結(jié)果如下:

Traceback(mostrecentcalllast): fun(0) raiseException('參數(shù)錯(cuò)誤') Exception:參數(shù)錯(cuò)誤 參數(shù)錯(cuò)誤

【例8-3】一個(gè)攝氏溫度與華氏溫度的轉(zhuǎn)換器202025/3/6defc2f():TempStr=input("請(qǐng)輸入帶有符號(hào)的溫度值:")ifTempStr[-1]in['F','f']:C=(eval(TempStr[0:-1])-32)/1.8print("轉(zhuǎn)換后的溫度是{:.2f}C".format(C))elifTempStr[-1]in['C','c']:F=1.8*eval(TempStr[0:-1])+32print("轉(zhuǎn)換后的溫度是{:.2f}F".format(F))else:raiseException("輸入格式錯(cuò)誤")while(True):try:x=c2f()exceptExceptionase:print(e)else:print('溫度轉(zhuǎn)換完成')程序執(zhí)行情況如下:

請(qǐng)輸入帶有符號(hào)的溫度值:30f轉(zhuǎn)換后的溫度是-1.11C溫度轉(zhuǎn)換完成請(qǐng)輸入帶有符號(hào)的溫度值:20c轉(zhuǎn)換后的溫度是68.00F溫度轉(zhuǎn)換完成請(qǐng)輸入帶有符號(hào)的溫度值:40h輸入格式錯(cuò)誤請(qǐng)輸入帶有符號(hào)的溫度值:

8.3.2自定義異常

在引發(fā)異常時(shí),應(yīng)該選擇合適的異常類,從而可以明確地描述該異常情況。

如果系統(tǒng)的標(biāo)準(zhǔn)異常無法更準(zhǔn)確地表達(dá)應(yīng)用中的場(chǎng)景,可以考慮用戶自定義異常,通過繼承Exception基類或Exception的子類,即可根據(jù)需要進(jìn)行異常的自定義。212025/3/6【例8-4】一個(gè)攝氏溫度與華氏溫度的轉(zhuǎn)換器222025/3/6classAuctionException(Exception):def__init__(self,item,price,message):super().__init__()self.item=itemself.price=priceself.message=message

def__str__(self):return'物品:'+self.item+'\t價(jià)格:'+str(self.price)+'\t描述:'+self.messageclassAuction:def__init__(self,item,init_price):self.item=itemself.init_price=init_pricedefbid(self,bid_price):ifself.init_price>float(bid_price):raiseAuctionException(self.item,bid_price,"競(jìng)拍價(jià)比起拍價(jià)低,不允許競(jìng)拍!")defmain():a=Auction('古玩',20.4)try:a.bid(19)exceptAuctionExceptionasae:print(ae)main()程序執(zhí)行情況如下:物品:古玩

價(jià)格:19 描述:競(jìng)拍價(jià)比起拍價(jià)低,不允許競(jìng)拍!

程序執(zhí)行情況如下:物品:古玩

價(jià)格:19 描述:競(jìng)拍價(jià)比起拍價(jià)低,不允許競(jìng)拍!8.4斷言與上下文管理

斷言與上下文管理是兩種特殊形式的異常處理方式,它們?cè)谛问缴媳犬惓L幚斫Y(jié)構(gòu)更加簡(jiǎn)潔,同時(shí)可以滿足一般的異常處理或條件確認(rèn),并且可以與標(biāo)準(zhǔn)的異常處理結(jié)構(gòu)聯(lián)合使用。232025/3/68.4.1斷言斷言在程序設(shè)計(jì)中用于表達(dá)某個(gè)對(duì)象的某種判斷條件,如果不成立則報(bào)錯(cuò)。其語法是:assertcondition[,reason]當(dāng)判斷條件表達(dá)式condition為真時(shí),什么都不做;

如果表達(dá)式為假,則拋出異常。

assert語句一般用于開發(fā)程序時(shí)對(duì)特定必須滿足的條件進(jìn)行驗(yàn)證,僅當(dāng)__debug__為True時(shí)有效。242025/3/68.4.1斷言252025/3/6>>>a=3>>>b=5>>>asserta==b,'amustbeequaltob'Traceback(mostrecentcalllast):File"<pyshell#17>",line1,in<module>asserta==b,'amustbeequaltob'AssertionError:amustbeequaltob>>>try:

asserta==b,'amustbeequaltob'

exceptAssertionErrorasreason:

print('%s:%s'%(reason.__class__.__name__,reason))AssertionError:amustbeequaltob8.4.2上下文管理

使用上下文管理語句with可以自動(dòng)管理資源,在代碼塊執(zhí)行完畢后自動(dòng)還原進(jìn)入該代碼塊之前的現(xiàn)場(chǎng)或上下文。with語句的語法如下:

withcontext_expr[asvar]: with語句塊262025/3/6withopen("myfile.txt")asf: forlineinf: print(line,end="")8.5程序調(diào)試

使用IDLE調(diào)試代碼

使用pdb調(diào)試代碼272025/3/68.5.1使用IDLE調(diào)試代碼Python標(biāo)準(zhǔn)開發(fā)環(huán)境IDLE可以直接進(jìn)行代碼調(diào)試。

IDLE可以支持在命令行直接進(jìn)行調(diào)試,也可以在程序編輯狀態(tài)進(jìn)行斷點(diǎn)設(shè)置和調(diào)試。

進(jìn)入調(diào)試狀態(tài)以后,程序會(huì)處于暫停狀態(tài),直到按下下列五個(gè)按鈕:282025/3/68.5.1使用IDLE調(diào)試代碼Go:程序正常執(zhí)行至終止,或到達(dá)一個(gè)“斷點(diǎn)”。Step:執(zhí)行下一行代碼,如果下一行代碼是一個(gè)函數(shù)調(diào)用,調(diào)試器會(huì)進(jìn)入函數(shù)內(nèi)部繼續(xù)執(zhí)行。Over:執(zhí)行下一行代碼,如果下一行代碼是函數(shù)調(diào)用,將越過該函數(shù)內(nèi)部的代碼。Out:從當(dāng)前的函數(shù)調(diào)用中跳出來。Quit:用于停止調(diào)試,不必繼續(xù)執(zhí)行剩下的程序,就點(diǎn)擊Quit按鈕。292025/3/68.5.1使用IDLE調(diào)試代碼302025/3/6在C:\Temp下新建一個(gè)文件test.py,其中內(nèi)容如下:deffact(n):f=1foriinrange(1,n+1):f*=ireturnfx=fact(5)print(x)以上是求階乘的程序。8.5.1使用IDLE調(diào)試代碼在IDLE中編輯此程序,并打開Debuger調(diào)試窗口。312025/3/68.5.2使用pdb調(diào)試代碼

pdb是Python自帶的交互式代碼調(diào)試模塊,代碼文件為pdb.py,需要導(dǎo)入后才能使用其中的功能。322025/3/6命令說明h(help)幫助w(where)打印當(dāng)前執(zhí)行堆棧d(down)執(zhí)行跳轉(zhuǎn)到在當(dāng)前堆棧的深一層u(up)執(zhí)行跳轉(zhuǎn)到當(dāng)前堆棧的上一層b(break)添加斷點(diǎn)bline_no:當(dāng)前腳本的line_no行添加斷點(diǎn)bfilename:line_no:腳本filename的line_no行添加斷點(diǎn)bfunction:在函數(shù)function的第一條可執(zhí)行語句處添加斷點(diǎn)8.5.2使用pdb調(diào)試代碼332025/3/6cl(clear)清除斷點(diǎn)cl清除所有斷點(diǎn)clbpnumber1bpnumber2...清除斷點(diǎn)號(hào)為bpnumber1,bpnumber2...的斷點(diǎn)cllineno清除當(dāng)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論