版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
任務(wù)8:系統(tǒng)異常處理Python程序設(shè)計(jì)1、任務(wù)描述目錄2、技術(shù)準(zhǔn)備Python程序設(shè)計(jì)3、任務(wù)實(shí)施1、任務(wù)描述本任務(wù)主要完成當(dāng)用戶輸入的成績(jī)數(shù)據(jù)不合法、數(shù)據(jù)類型不匹配等異常的處理,使程序不僅能夠處理正確輸入,對(duì)一些非法輸入也能夠正常處理,從而提高系統(tǒng)的健壯性。完成本任務(wù)需要了解和掌握Python中異常處理機(jī)制和各種異常處理結(jié)構(gòu)的使用。2.1錯(cuò)誤類型技術(shù)準(zhǔn)備2.2異常類Python程序設(shè)計(jì)2.3異常捕獲和處理2.1錯(cuò)誤類型在編制程序時(shí),錯(cuò)誤的產(chǎn)生是不可避免的。引發(fā)錯(cuò)誤的原因有很多,如下標(biāo)越界、要訪問的文件不存在、類型錯(cuò)誤等。如果這些錯(cuò)誤得不到正確的處理就會(huì)導(dǎo)致程序終止運(yùn)行。而通過異常處理可以避免此類情況,從而使得程序更加健壯,具有更強(qiáng)的容錯(cuò)性。程序錯(cuò)誤一般分為語(yǔ)法錯(cuò)誤、運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤3種。2.1錯(cuò)誤類型1、語(yǔ)法錯(cuò)誤語(yǔ)法錯(cuò)誤是指不符合語(yǔ)法規(guī)則而產(chǎn)生的錯(cuò)誤,如標(biāo)識(shí)符命名錯(cuò)誤、不正確的縮進(jìn)等,這類錯(cuò)誤通常在編輯或解釋時(shí)就會(huì)被檢測(cè)出來,這種錯(cuò)誤一旦產(chǎn)生程序?qū)⒉粫?huì)被運(yùn)行。在編輯代碼時(shí),Python會(huì)對(duì)輸入的代碼直接進(jìn)行語(yǔ)法檢查,如果有語(yǔ)法錯(cuò)誤,就會(huì)給出相應(yīng)的語(yǔ)法錯(cuò)誤提示信息。>>>print('a')#print前多加了一個(gè)空格,縮進(jìn)錯(cuò)誤
SyntaxError:unexpectedindent>>>12a=3#標(biāo)識(shí)符命名錯(cuò)誤SyntaxError:invalidsyntax2.1錯(cuò)誤類型2、運(yùn)行時(shí)錯(cuò)誤有些代碼在編寫時(shí)沒有錯(cuò)誤,但在程序運(yùn)行過程中發(fā)生錯(cuò)誤,這類錯(cuò)誤稱為運(yùn)行時(shí)錯(cuò)誤,例如除數(shù)為0、列表索引越界、數(shù)據(jù)類型不匹配等,出現(xiàn)這類錯(cuò)誤,系統(tǒng)會(huì)中止程序運(yùn)行,然后拋出異常。>>>3/0#除數(shù)為0Traceback(mostrecentcalllast):File"<pyshell#11>",line1,in<module>3/0ZeroDivisionError:divisionbyzero>>>alist=[1,2,3]>>>alist[4]#列表索引越界Traceback(mostrecentcalllast):File"<pyshell#13>",line1,in<module>alist[4]IndexError:listindexoutofrange2.1錯(cuò)誤類型3、邏輯錯(cuò)誤邏輯錯(cuò)誤又稱語(yǔ)義錯(cuò)誤,表現(xiàn)形式是程序并不報(bào)任何語(yǔ)法錯(cuò)誤,也沒有異常,但最終程序運(yùn)行結(jié)果與預(yù)期結(jié)果不一致。例如運(yùn)算符使用不合理、語(yǔ)句次序不正確、循環(huán)語(yǔ)句的初始值和終值設(shè)置不正確等。例如求1~100的累加和,代碼如下。mysum=0foriinrange(100):mysum+=iprint("1到100的和是:"mysum)【運(yùn)行結(jié)果】1到100的和是:4950上述求1~100的累加和的代碼段既沒有語(yǔ)法錯(cuò)誤,也可以正常運(yùn)行,但最終得出結(jié)果與預(yù)期不相符,這就是邏輯錯(cuò)誤,這類錯(cuò)誤相對(duì)于其他兩類錯(cuò)誤較難以查覺。異常處理主要指的是第2類錯(cuò)誤的處理。2.2異常類程序運(yùn)行時(shí)發(fā)生的每個(gè)異常都對(duì)應(yīng)著一個(gè)異常類,Python中的異常類有很多,一些常見異常類:異常類含義AttributeError對(duì)象屬性錯(cuò)誤BaseException所有異常的基類Exception常規(guī)錯(cuò)誤基類ImportError導(dǎo)入模塊/對(duì)象失敗IndentationError縮進(jìn)錯(cuò)誤IndexError索引錯(cuò)誤IOError輸入/輸出操作失敗NameError對(duì)象命名錯(cuò)誤SyntaxError語(yǔ)法錯(cuò)誤TypeError類型無效錯(cuò)誤ValueError無效的參數(shù)ZeroDivisionError除(或取模)零2.3異常捕獲和處理1、try…except…結(jié)構(gòu)格式:try:try代碼塊except[異常類asex]:except代碼塊try子句中的代碼塊包含可能會(huì)引發(fā)異常的語(yǔ)句,而except子句則用來捕捉相應(yīng)的異常。如果try子句中的代碼引發(fā)異常并被except子句捕捉,就執(zhí)行except子句的代碼塊;如果try中的代碼塊沒有出現(xiàn)異常就繼續(xù)往下執(zhí)行異常處理結(jié)構(gòu)后面的代碼;如果出現(xiàn)異常但沒有被except捕獲,繼續(xù)往外層拋出,如果所有層都沒有捕獲并處理該異常,程序崩潰并將該異常呈現(xiàn)給最終用戶。except后面可以指定要捕獲的異常類,如果沒有指定表示捕捉所有的異常。ex表示捕捉到的錯(cuò)誤對(duì)象(名字可以任意)。2.3異常捕獲和處理【例8?1】try…except…結(jié)構(gòu)使用。求兩個(gè)數(shù)的商,如果除數(shù)為0時(shí)會(huì)引發(fā)異常,可通過捕獲ZeroDivisionError異常類來處理異常。n1=eval(input('enteranumber:'))n2=eval(input('enteranumber:'))try:result=n1/n2#除數(shù)為0時(shí)會(huì)引發(fā)異常exceptZeroDivisionErrorasex:#處理被0除異常print(ex)【運(yùn)行結(jié)果】enteranumber:4enteranumber:0divisionbyzero2.3異常捕獲和處理2、try…except…else…結(jié)構(gòu)格式:try:try代碼塊except[異常類asex]:except代碼塊else:else代碼塊功能:如果try中的代碼塊有異常則執(zhí)行except代碼塊,沒有拋出異常時(shí)則執(zhí)行else代碼塊。2.3異常捕獲和處理【例8?2】try…except…else…結(jié)構(gòu)使用。仍以求兩個(gè)數(shù)的商為例說明此結(jié)構(gòu)的使用。如果除數(shù)不為0,就輸出最終結(jié)果。程序代碼如下所示:n1=eval(input('enteranumber:'))n2=eval(input('enteranumber:'))try:result=n1/n2exceptZeroDivisionErrorasex:print(ex)else:print('{}/{}={}'.format(n1,n2,result))【運(yùn)行結(jié)果】當(dāng)除數(shù)為0時(shí)會(huì)拋出異常:enteranumber:4enteranumber:0divisionbyzero如除數(shù)不為0則執(zhí)行else中的語(yǔ)句,輸出最終結(jié)果。enteranumber:4enteranumber:24/2=2.02.3異常捕獲和處理3、try…except…else…finally結(jié)構(gòu)語(yǔ)法格式:try:try代碼塊except[異常類asex]:except代碼塊else:else代碼塊finally:finally代碼塊首先執(zhí)行try代碼塊,如果try代碼塊有異常,就執(zhí)行except代碼塊(發(fā)生的異常類型須與except后面指定的異常類型一致);如果沒有發(fā)生異常,則執(zhí)行else代碼塊;最后不論是否有異常,都會(huì)執(zhí)行finally代碼塊。2.3異常捕獲和處理【例8?3】try…except…else…finally結(jié)構(gòu)使用。將上述求兩個(gè)數(shù)的商的程序改寫為如下所示:n1=eval(input('enteranumber:'))n2=eval(input('enteranumber:'))try:result=n1/n2exceptZeroDivisionErrorasex:print(ex)else:print('{}/{}={}'.format(n1,n2,result))finally:print('theend')【運(yùn)行結(jié)果】enteranumber:4enteranumber:24/2=2.0theend再運(yùn)行一次程序:enteranumber:4enteranumber:0divisionbyzerotheend2.3異常捕獲和處理4、捕獲多個(gè)異常實(shí)際開發(fā)中,同一段代碼可能會(huì)拋出多種異常,并且需要針對(duì)不同的異常類型進(jìn)行處理,這時(shí)可通過添加相應(yīng)的except子句來實(shí)現(xiàn),一個(gè)except子句捕獲一個(gè)異常,一旦某個(gè)except子句捕捉到了異常,其他的except子句將不會(huì)再嘗試捕捉異常。該結(jié)構(gòu)有些類似多分支選擇結(jié)構(gòu),語(yǔ)法格式如下:try:try代碼塊except異常類1[asex1]:except代碼塊except異常類2[asex2]:except代碼塊…[else:else代碼塊][finally:finally代碼塊]2.3異常捕獲和處理【例8?4】捕獲多個(gè)異常。仍以求兩個(gè)數(shù)的商為例來說明,用戶從鍵盤輸入數(shù)據(jù)時(shí),如果輸入的數(shù)據(jù)不是數(shù)值型數(shù)據(jù)時(shí),也會(huì)引發(fā)異常,對(duì)此異常也進(jìn)行相應(yīng)的處理。代碼如下:try:n1=eval(input('enteranumber:'))n2=eval(input('enteranumber:'))result=n1/n2exceptZeroDivisionError:print('除數(shù)不能為0')exceptException:print('除數(shù)和被除數(shù)應(yīng)為數(shù)值型')else:print('{}/{}={}'.format(n1,n2,result))finally:print('theend')【運(yùn)行結(jié)果】第一次運(yùn)行,輸入除數(shù)為0時(shí):enteranumber:4enteranumber:0除數(shù)不能為0theend第二次運(yùn)行,輸入數(shù)據(jù)有一個(gè)不合法時(shí):enteranumber:3enteranumber:d除數(shù)和被除數(shù)應(yīng)為數(shù)值型theend3.1成績(jī)異常處理任務(wù)實(shí)施3.2系統(tǒng)測(cè)試Python程序設(shè)計(jì)3.1
成績(jī)異常處理為學(xué)生信息管理模塊中成績(jī)輸入添加相應(yīng)的異常處理,保證輸入的成績(jī)?cè)?-100之間。在任務(wù)6實(shí)現(xiàn)的StudentList類中添加一個(gè)處理成績(jī)輸入的方法,代碼如下:def__enterScore(self,message):whileTrue:try:score=input(message)if0<=int(score)<=100:breakelse:print('輸入錯(cuò)誤,成績(jī)應(yīng)在0到100之間')except:print('輸入錯(cuò)誤,成績(jī)應(yīng)在0到100之間')returnscore3.1
成績(jī)異常處理然后將StudentList類中原來的insert()和update()方法分別做相應(yīng)的修改,輸入各科成績(jī)時(shí)利用_enterScore()方法來實(shí)現(xiàn),以保證輸入的成績(jī)?cè)?-100之間。修改后的insert()方法代碼如下:definsert(self):#添加學(xué)生信息whileTrue:no=input('學(xué)號(hào):')name=input('姓名:')chinese=self.__enterScore('語(yǔ)文成績(jī):')math=self.__enterScore('數(shù)學(xué)成績(jī):')english=self.__enterScore('英語(yǔ)成績(jī):')stu=Student(no,name,chinese,math,english)self.stulist.append(stu)choice=input('繼續(xù)添加(y/n)?').lower()ifchoice=='n':break3.1
成績(jī)異常處理修改后的update()方法代碼如下:defupdate(self):#修改學(xué)生信息whileTrue:no=input('請(qǐng)輸入要修改的學(xué)生學(xué)號(hào):')forstui
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 糧食生產(chǎn)調(diào)撥管理制度
- 安全生產(chǎn)考生考試制度
- 安全生產(chǎn)工作分級(jí)制度
- 百度生產(chǎn)調(diào)度管理制度
- 會(huì)所安全生產(chǎn)管理制度
- 農(nóng)化生產(chǎn)企業(yè)管理制度
- 生產(chǎn)異常管理制度匯編
- 某酒店安全生產(chǎn)制度
- 安全生產(chǎn)信息專報(bào)制度
- 電廠生產(chǎn)管理內(nèi)控制度
- 綜合門診部管理制度
- 定制手機(jī)采購(gòu)合同協(xié)議
- 數(shù)據(jù)治理實(shí)施方案
- 煤磨動(dòng)火作業(yè)施工方案
- 工程施工及安全管理制度
- 電梯井道腳手架搭設(shè)方案
- 虛擬電廠解決方案
- 嗜酸性粒細(xì)胞與哮喘發(fā)病關(guān)系的研究進(jìn)展
- 《陸上風(fēng)電場(chǎng)工程可行性研究報(bào)告編制規(guī)程》(NB/T 31105-2016)
- 京瓷哲學(xué)手冊(cè)樣本
- 五年級(jí)簡(jiǎn)便計(jì)算100題
評(píng)論
0/150
提交評(píng)論