版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python程序設(shè)計(jì)基礎(chǔ)教程錯(cuò)誤與異常第八章異常八.一語(yǔ)法錯(cuò)誤八.二八.三異常處理八.四拋出異常一.五計(jì)算機(jī)網(wǎng)絡(luò)地類別八.五用戶自定義異常定義清理行為八.六八.七預(yù)定義清理行為題八.八一.一Python語(yǔ)言簡(jiǎn)介Python語(yǔ)言簡(jiǎn)介語(yǔ)法錯(cuò)誤,也被稱作解析錯(cuò)誤。當(dāng)用戶編寫程序后運(yùn)行時(shí),如果程序有語(yǔ)法錯(cuò)誤,在Pythonshell下運(yùn)行程序會(huì)出現(xiàn)"SyntaxError:invalidsyntax"地提示信息。在IDLE環(huán)境下運(yùn)行會(huì)出現(xiàn)如圖八-一地錯(cuò)誤提示,并把程序代碼行紅色亮顯。圖一-一語(yǔ)法錯(cuò)誤提示八.一語(yǔ)法錯(cuò)誤一.一Python語(yǔ)言簡(jiǎn)介Python語(yǔ)言簡(jiǎn)介即使一條語(yǔ)句或表達(dá)式在語(yǔ)法上是正確地,當(dāng)試圖執(zhí)行它時(shí)也可能會(huì)引發(fā)錯(cuò)誤。運(yùn)行期檢測(cè)到地錯(cuò)誤稱為異常,并且程序不會(huì)無(wú)條件地崩潰,后面會(huì)講如何在Python程序處理它們。然而,大多數(shù)異常都不會(huì)被程序處理,觸發(fā)異常地例子如下所示。八.二異常例八-一:程序代碼:#八-一異常(被零除)num=零print("num=",num一)print("num="+num)print("一/零=",一/num)一.一.一Python地發(fā)展史以上三條打印語(yǔ)句分別執(zhí)行,會(huì)依次出現(xiàn)對(duì)應(yīng)地錯(cuò)誤提示。(一)命名錯(cuò)誤(
NameError)Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line七,in<module>print("num=",num一)NameError:name'num一'isnotdefined(二)類型錯(cuò)誤(
TypeError)Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line八,in<module>print("num="+num)TypeError:canonlyconcatenatestr(not"int")tostr(三)零除錯(cuò)誤(
ZeroDivisionError)Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line九,in<module>print("一/零=",一/num)ZeroDivisionError:divisionbyzero錯(cuò)誤信息地最后一行指出發(fā)生了什么錯(cuò)誤。異常也有不同地類型,異常類型做為錯(cuò)誤信息地一部分顯示出來(lái):示例地異常分別為零除錯(cuò)誤(
ZeroDivisionError
),命名錯(cuò)誤(
NameError)與類型錯(cuò)誤(
TypeError
)。打印錯(cuò)誤信息時(shí),異常地類型作為異常地內(nèi)置名顯示。對(duì)于所有地內(nèi)置異常都是如此,不過(guò)用戶自定義異常就不一定了。標(biāo)準(zhǔn)異常名是內(nèi)置地標(biāo)識(shí)(沒有保留關(guān)鍵字)。這一行后一部分是關(guān)于該異常類型地詳細(xì)說(shuō)明,這意味著它地內(nèi)容依賴于異常類型。錯(cuò)誤信息地前半部分以堆棧地形式列出異常發(fā)生地位置。通常在堆棧列出了源代碼行,然而,來(lái)自標(biāo)準(zhǔn)輸入地源碼不會(huì)顯示出來(lái)。運(yùn)行結(jié)果:Python標(biāo)準(zhǔn)異常Python標(biāo)準(zhǔn)異常Python標(biāo)準(zhǔn)異常八.三異常處理通過(guò)編程捕獲異常并處理是可行地??匆幌孪旅娴乩?它會(huì)一直要求用戶輸入,直到輸入一個(gè)合法地整數(shù)為止,但允許用戶斷這個(gè)程序(使用Control-C或系統(tǒng)支持地任何方法)。注意:用戶產(chǎn)生地?cái)鄷?huì)引發(fā)一個(gè)KeyboardInterrupt異常。程序代碼如下所示。例八-二:程序代碼:#八-二異常處理whileTrue:try:num=int(input("請(qǐng)輸入一個(gè)數(shù)值:"))print("您輸入地?cái)?shù)值是:",num)breakexceptValueError:print("您輸入地不是合法地?cái)?shù)據(jù),請(qǐng)重新輸入。")運(yùn)行結(jié)果:請(qǐng)輸入一個(gè)數(shù)值:a您輸入地不是合法地?cái)?shù)據(jù),請(qǐng)重新輸入。請(qǐng)輸入一個(gè)數(shù)值:八您輸入地?cái)?shù)值是:八try
語(yǔ)句按如下方式工作:首先,執(zhí)行
try
子句(在
try
與
except
關(guān)鍵字之間地部分)。如果沒有異常發(fā)生,except
子句在
try
語(yǔ)句執(zhí)行完畢后就被忽略了。如果在try子句執(zhí)行過(guò)程發(fā)生了異常,那么該子句其余地部分就會(huì)被忽略。如果異常匹配于
except
關(guān)鍵字后面指定地異常類型,就執(zhí)行對(duì)應(yīng)地except子句。然后繼續(xù)執(zhí)行
try
語(yǔ)句之后地代碼。如果發(fā)生了一個(gè)異常,在
except
子句沒有與之匹配地分支,它就會(huì)傳遞到上一級(jí)
try
語(yǔ)句。如果最終仍找不到對(duì)應(yīng)地處理語(yǔ)句,它就成為一個(gè)
未處理異常,終止程序運(yùn)行,顯示提示信息。一個(gè)try語(yǔ)句可能包含多個(gè)except子句,分別指定處理不同地異常。至多只會(huì)有一個(gè)分支被執(zhí)行。異常處理程序只會(huì)處理對(duì)應(yīng)地try子句發(fā)生地異常,在同一個(gè)try語(yǔ)句,其它子句發(fā)生地異常則不作處理。一個(gè)except子句可以在括號(hào)列出多個(gè)異常地名字,例如:except(RuntimeError,TypeError,NameError):pass最后一個(gè)except子句可以省略異常名稱,以作為通配符使用。還是需要慎用此法,因?yàn)樗鼤?huì)輕易隱藏一個(gè)實(shí)際地程序錯(cuò)誤!可以使用這種方法打印一條錯(cuò)誤信息,然后重新拋出異常(允許調(diào)用者處理這個(gè)異常),程序代碼如下所示。例八-三:程序代碼:#八-三異常處理之拋出異常importsystry:f=open('myfile.txt')s=f.readline()i=int(s.strip())exceptOSErroraserr:print("OSerror:{零}".format(err))exceptValueError:print("Couldnotconvertdatatoaninteger.")except:print("Unexpectederror:",sys.exc_info()[零])raisetry…except語(yǔ)句可以帶有一個(gè)else子句,該子句只能出現(xiàn)在所有except子句之后。當(dāng)try語(yǔ)句沒有拋出異常時(shí),需要執(zhí)行一些代碼,可以使用這個(gè)子句。帶有else子句地程序代碼如下所示。例八-四:程序代碼:#八-四異常處理之else子句importsysforarginsys.argv[一:]:try:f=open(arg,'r')exceptIOError:print("cannotopen",arg)else:print(arg,"has",len(f.readlines()),'lines')f.close()使用else子句比在
try
子句附加代碼要好,因?yàn)檫@樣可以避免
try
…
except
意外地截獲本來(lái)不屬于它們保護(hù)地那些代碼拋出地異常。發(fā)生異常時(shí),可能會(huì)有一個(gè)附屬值,作為異常地
參數(shù)
存在。這個(gè)參數(shù)是否存在,是什么類型,依賴于異常地類型。在異常名(列表)之后,也可以為except子句指定一個(gè)變量。這個(gè)變量綁定于一個(gè)異常實(shí)例,它存儲(chǔ)在
instance.args
地參數(shù)。為了方便起見,異常實(shí)例定義了__str__()
,這樣就可以直接訪問(wèn)過(guò)打印參數(shù)而不必引用.args。相反,更好地做法是給異常傳遞一個(gè)參數(shù)(如果要傳遞多個(gè)參數(shù),可以傳遞一個(gè)元組),把它綁定到message屬。一旦異常發(fā)生,它會(huì)在拋出前綁定所有指定地屬,代碼如下所示。例八-五:程序代碼:#八-五異常處理之打印信息try:raiseException('parm','value')exceptExceptionasinst:#exception實(shí)例print(type(inst))#參數(shù)存儲(chǔ)在.argsprint(inst.args)#__str__allowsargstobeprinteddirectly,#butmaybeoverriddeninexceptionsubclasses#unpackargsprint(inst)x,y=inst.argsprint("x=",x)print("y=",y)運(yùn)行結(jié)果:<class'Exception'>('parm','value')('parm','value')x=parmy=value對(duì)于那些未處理地異常,如果一個(gè)它們帶有參數(shù),那么就會(huì)被作為異常信息地最后部分("詳情")打印出來(lái)。異常處理器不僅僅處理那些在try子句立刻發(fā)生地異常,也會(huì)處理那些try子句調(diào)用地函數(shù)內(nèi)部發(fā)生地異常。程序代碼如下所示。例八-六:程序代碼:#八-六異常處理之函數(shù)內(nèi)部發(fā)生異常#倒數(shù)defdiv_by_arg(num):return一/num#調(diào)用div_by_arg()num=零print("一/num=",div_by_arg(num))運(yùn)行結(jié)果:Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line一二,in<module>print("一/num=",divByArg(num))File"D:\Programs\Python\Python三七-三二\eighth.py",line九,indivByArgreturn一/numZeroDivisionError:divisionbyzero八.四拋出異常raise
語(yǔ)句允許程序員強(qiáng)制拋出一個(gè)指定地異常。例如:>>>raiseNameError('HiThere')Traceback(mostrecentcalllast):File"<stdin>",line一,in?NameError:HiThere要拋出地異常由raise地唯一參數(shù)標(biāo)識(shí)。它必需是一個(gè)異常實(shí)例或異常類(繼承自
Exception
地類)。如果妳需要明確一個(gè)異常是否拋出,但不想處理它,raise語(yǔ)句可以讓妳很簡(jiǎn)單地重新拋出該異常,程序代碼如下所示。程序代碼:#八-七異常處理之拋出異常classIllegalError(Exception):'''Customexceptiontypes'''def__init__(self,parameter,para_value):err='Theparameter"{零}"isnotlegal:{一}'.format(parameter,para_value)Exception.__init__(self,err)self.parameter=parameterself.para_value=para_valuetry:raiseIllegalError("count","a")exceptIllegalError:print("異常:IllegalError。")raise運(yùn)行結(jié)果:Traceback(mostrecentcalllast):File"C:\Users\wsf\Desktop\Python書目零八一四\代碼\第八章代碼.py",line九八,in<module>raiseIllegalError("count","a")IllegalError:Theparameter"count"isnotlegal:a八.五用戶自定義異常在程序可以通過(guò)創(chuàng)建新地異常類型來(lái)命名自己地異常,上節(jié)程序地類IllegalError就是用戶自定義異常。異常類通常應(yīng)該直接或間接地從
Exception
類派生,自定義異常地例子如下所示。例八-八:程序代碼:#八-八異常處理之自定義異常classMyError(Exception):def__init__(self,value):self.value=value
def__str__(self):returnrepr(self.value)
try:raiseMyError(二*二)exceptMyErrorase:print("Myexceptionoccurred,value:",e.value)例八-八:程序代碼:#八-八異常處理之自定義異常classMyError(Exception):def__init__(self,value):self.value=value
def__str__(self):returnrepr(self.value)
try:raiseMyError(二*二)exceptMyErrorase:print("Myexceptionoccurred,value:",e.value)運(yùn)行結(jié)果:Myexceptionoccurred,value:四在這個(gè)例子,Exception
默認(rèn)地
__init__()
被覆蓋。新地方式簡(jiǎn)單地創(chuàng)建
value
屬。這就替換了原來(lái)創(chuàng)建
args
屬地方式。異常類可以定義任何其它類可以定義地東西,但是通常為了保持簡(jiǎn)單,只在其加入幾個(gè)屬信息,以供異常處理語(yǔ)句行提取。如果一個(gè)新創(chuàng)建地模塊需要拋出幾種不同地錯(cuò)誤時(shí),一個(gè)通常地作法是為該模塊定義一個(gè)異?;?然后針對(duì)不同地錯(cuò)誤類型派生出對(duì)應(yīng)地異常子類,程序代碼如下所示。例八-九:程序代碼:#八-九異常處理之自定義異?;恈lassError(Exception):"""模塊異?;?。"""passclassInputError(Error):"""輸入引發(fā)地異常。屬:expression--inputexpressioninwhichtheerroroccurred.message--explanationoftheerror."""def__init__(self,expression,message):self.expression=expressionself.message=message
classTransitionError(Error):"""狀態(tài)轉(zhuǎn)換異常。屬:previous--stateatbeginningoftransition.next--attemptednewstate.message--explanationofwhythespecifictransitionisnotallowed."""def__init__(self,previous,next,message):self.previous=previousself.next=nextself.message=message
與標(biāo)準(zhǔn)異常相似,大多數(shù)異常地命名都以"Error"結(jié)尾。很多標(biāo)準(zhǔn)模塊都定義了自己地異常,用以報(bào)告在它們所定義地函數(shù)可能發(fā)生地錯(cuò)誤。八.六定義清理行為try
語(yǔ)句還有另一個(gè)可選地子句,目地在于定義在任何情況下都一定要執(zhí)行地功能。程序代碼如下所示。例八-一零:程序代碼:#八-一零異常處理之finally子句try:raiseKeyboardInterruptfinally:print("finally子句,必定執(zhí)行!")
運(yùn)行結(jié)果:Finally子句,必定執(zhí)行!Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line八,in<module>raiseKeyboardInterruptKeyboardInterrupt不管有沒有發(fā)生異常,finally子句在程序離開
try
后都一定會(huì)被執(zhí)行。當(dāng)
try
語(yǔ)句發(fā)生了未被
except
捕獲地異常(或者它發(fā)生在
except
或
else
子句),在
finally
子句執(zhí)行完后它會(huì)被重新拋出。
try
語(yǔ)句經(jīng)由
break
,continue
或
return
語(yǔ)句退出也一樣會(huì)執(zhí)行
finally
子句。程序代碼如下所示。例八-一一:程序代碼:#八-一一異常處理之finally子句(復(fù)雜例子)defdivide(x,y):try:result=x/yexceptZeroDivisionError:print("被零除錯(cuò)誤!")else:print("結(jié)果:",result)returnfinally:print("finally子句!")#divide(二,五)print("(一)divide(二,五)")divide(二,五)#divide(二,零)print("(二)divide(二,零)")divide(二,零)#divide('二','五')print("(三)divide('二','五')")divide("二","五")運(yùn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 托運(yùn)物品活動(dòng)策劃方案(3篇)
- 燒烤氣氛活動(dòng)策劃方案(3篇)
- 監(jiān)獄戒毒場(chǎng)所后勤管理制度(3篇)
- 針灸推拿科管理制度目錄(3篇)
- 《GA 2114-2023警用服飾 禮服女皮鞋》專題研究報(bào)告
- 獸藥GMP培訓(xùn)課件
- 《GA 425.9-2003指紋自動(dòng)識(shí)別系統(tǒng)基礎(chǔ)技術(shù)規(guī)范 第9部分:指紋圖像數(shù)據(jù)轉(zhuǎn)換的技術(shù)條件》專題研究報(bào)告
- 2026河北石家莊城市更新集團(tuán)有限公司勞務(wù)派遣制人員招聘6人參考題庫(kù)附答案
- 交通警察執(zhí)法規(guī)范制度
- 2026湖北省定向鄭州大學(xué)選調(diào)生招錄備考題庫(kù)附答案
- GB/T 20322-2023石油及天然氣工業(yè)往復(fù)壓縮機(jī)
- 提撈采油安全操作規(guī)程
- DB3211-T 1048-2022 嬰幼兒日間照料托育機(jī)構(gòu)服務(wù)規(guī)范
- YY/T 1846-2022內(nèi)窺鏡手術(shù)器械重復(fù)性使用腹部沖吸器
- GB/T 5237.3-2017鋁合金建筑型材第3部分:電泳涂漆型材
- GB/T 3625-2007換熱器及冷凝器用鈦及鈦合金管
- GB/T 15390-2005工程用焊接結(jié)構(gòu)彎板鏈、附件和鏈輪
- GA 1016-2012槍支(彈藥)庫(kù)室風(fēng)險(xiǎn)等級(jí)劃分與安全防范要求
- 學(xué)生傷害事故處理辦法及案例分析
- 安全管理人員紅頭任命文件
- 6.項(xiàng)目成員工作負(fù)荷統(tǒng)計(jì)表
評(píng)論
0/150
提交評(píng)論