




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
~1~第八章異常處理目錄異?;靖拍町惓L幚斫Y(jié)構(gòu)主動(dòng)拋出異常斷言上下文管理編程實(shí)踐本章習(xí)題-2-1.異常基本概念當(dāng)程序運(yùn)行出現(xiàn)錯(cuò)誤時(shí),就會(huì)產(chǎn)生異常(Exception)例如除以0、下標(biāo)越界、文件不存在、網(wǎng)絡(luò)異常、類(lèi)型錯(cuò)誤、磁盤(pán)空間不足等軟件的發(fā)展歷史告訴我們:異常是不可避免的因此,正視異常,允許異常的產(chǎn)生,當(dāng)異常產(chǎn)生了,采取適當(dāng)措施處理異常即可常見(jiàn)的Python異常類(lèi)型ValueError:當(dāng)函數(shù)接收到一個(gè)具有正確類(lèi)型但不適當(dāng)值的參數(shù)時(shí)觸發(fā)TypeError:當(dāng)操作或函數(shù)應(yīng)用于不適當(dāng)類(lèi)型的對(duì)象時(shí)觸發(fā)IndexError:當(dāng)序列中沒(méi)有此索引(index)時(shí)觸發(fā)KeyError:當(dāng)字典中不存在指定的鍵時(shí)觸發(fā)ZeroDivisionError:當(dāng)除數(shù)為零時(shí)觸發(fā)FileNotFoundError:當(dāng)嘗試訪問(wèn)不存在的文件時(shí)觸發(fā)3例1:嘗試訪問(wèn)不存在的字典鍵會(huì)觸發(fā)KeyError:my_dict={'a':1,'b':2}print(my_dict['c'])#KeyError:'c’通過(guò)檢查鍵是否存在于字典中,或使用dict.get()方法,可以避免這種錯(cuò)誤不適當(dāng)?shù)念?lèi)型會(huì)觸發(fā)TypeError:name='StudentNO.'+1#TypeError:canonlyconcatenatestr(not"int")tostr修改為:name='StudentNo.'+str(1)42.異常處理結(jié)構(gòu)語(yǔ)法異常:在調(diào)試(debug)程序過(guò)程中即可發(fā)現(xiàn)錯(cuò)誤,根據(jù)系統(tǒng)的錯(cuò)誤提示改正即可異常處理流程:但有些錯(cuò)誤卻在調(diào)試時(shí)不易發(fā)現(xiàn),比如網(wǎng)絡(luò)異常、磁盤(pán)空間不足、下標(biāo)越界等,只在某些特定條件下才可能發(fā)生。通過(guò)預(yù)先設(shè)計(jì)合適的異常處理機(jī)制,程序在遇到異常情況時(shí)能夠自動(dòng)執(zhí)行這些處理流程,從而有效地糾正或管理這些異常這種做法不僅提高了程序的穩(wěn)定性,而且確保了在遭遇意外情況時(shí)程序仍能平穩(wěn)運(yùn)行或優(yōu)雅地終止5異常處理結(jié)構(gòu)異常處理結(jié)構(gòu)在Python編程中,處理異常的基礎(chǔ)結(jié)構(gòu)是使用try...except...語(yǔ)句。這種結(jié)構(gòu)使得開(kāi)發(fā)者能夠捕捉并妥善處理在程序執(zhí)行過(guò)程中可能出現(xiàn)的異常,從而防止程序意外崩潰基本語(yǔ)法結(jié)構(gòu)如下:try:#這部分是可能出現(xiàn)異常的代碼塊exceptException[asreason]:#這部分是當(dāng)捕捉到異常時(shí)執(zhí)行的代碼塊,reason變量用于獲取異常的具體信息異常處理的邏輯如果try代碼塊中的語(yǔ)句運(yùn)行無(wú)異常:程序?qū)⑻^(guò)except塊,繼續(xù)執(zhí)行后續(xù)代碼如果try代碼塊中出現(xiàn)異常,且該異常被except子句捕獲:那么程序?qū)?zhí)行except子句中的異常處理代碼如果try代碼塊中出現(xiàn)異常,但未被except捕獲:則異常會(huì)被向外拋出如果所有層次都沒(méi)有捕獲和處理該異常:程序最終將終止,并向用戶(hù)顯示異常信息6例:whileTrue:
try:x=int(input("Pleaseenteranumber:"))break
except
ValueError:print("Thisisnotavalidnumber.Pleasetryagain...")如果用戶(hù)輸入的不是數(shù)字,將產(chǎn)生ValueError異常7擴(kuò)展的異常處理結(jié)構(gòu)除了基本的try...except...結(jié)構(gòu)外,還可以加入else和finally語(yǔ)句,以及多個(gè)except子句,形成更完整的異常處理流程擴(kuò)展的語(yǔ)法結(jié)構(gòu)try:#可能引發(fā)異常的代碼exceptException1[asreason1]:#處理第一種類(lèi)型的異常exceptException2[asreason2]:#處理第二種類(lèi)型的異常...else:#如果沒(méi)有異常發(fā)生,則執(zhí)行這個(gè)代碼塊finally:#無(wú)論是否發(fā)生異常,都會(huì)執(zhí)行這個(gè)代碼塊,通常用于釋放資源8例:try:#嘗試執(zhí)行的代碼,可能會(huì)產(chǎn)生異常
result=10/0exceptZeroDivisionError:#處理除零異常
print("不能除以零。")exceptTypeError:#處理類(lèi)型錯(cuò)誤異常
print("類(lèi)型錯(cuò)誤。")else:#如果沒(méi)有異常發(fā)生
print("操作成功。")finally:#無(wú)論是否發(fā)生異常
print("操作完成。")93.主動(dòng)拋出異常raise語(yǔ)句:允許程序員強(qiáng)制觸發(fā)指定的異常,這在需要明確指出錯(cuò)誤條件或強(qiáng)制執(zhí)行特定錯(cuò)誤處理邏輯時(shí)非常有用基本語(yǔ)法結(jié)構(gòu):raiseExceptionType("錯(cuò)誤信息")ExceptionType是要拋出的異常類(lèi)型,如ValueError,TypeError等,而“錯(cuò)誤信息”則是提供給異常處理器的額外信息10舉例:數(shù)據(jù)通信在數(shù)據(jù)通信中,確保所有的操作都在有效連接上執(zhí)行非常關(guān)鍵。如果嘗試在尚未建立或已關(guān)閉的連接上發(fā)送數(shù)據(jù),可能會(huì)導(dǎo)致程序錯(cuò)誤或數(shù)據(jù)丟失。為了管理這種潛在的錯(cuò)誤并增強(qiáng)程序的健壯性,開(kāi)發(fā)者可以采用異常處理機(jī)制來(lái)明確地監(jiān)控和響應(yīng)連接狀態(tài)defsend_data(data,connection):ifnotconnection.is_open():raiseConnectionError("Connectionisnotopen.")connection.send(data)connection=NetworkConnection()try:send_data("Hello",connection)exceptConnectionErrorase:print(e)#輸出:Connectionisnotopen.send_data函數(shù)在發(fā)送數(shù)據(jù)前檢查網(wǎng)絡(luò)連接是否開(kāi)啟,如果連接沒(méi)有開(kāi)啟,則拋出ConnectionError11兩種錯(cuò)誤管理策略?xún)煞N常見(jiàn)的錯(cuò)誤管理策略:使用預(yù)檢查和拋出異常處理預(yù)檢查方法:send_data(data,connection):ifnotconnection.is_open():print("Connectionisnotopen.")returnconnection.send(data)connection=NetworkConnection()send_data("Hello",connection)優(yōu)點(diǎn):直觀和顯式:代碼中直接檢查條件,如連接狀態(tài),可以讓代碼的邏輯更加明確和直觀防御性編程:通過(guò)預(yù)檢查防止錯(cuò)誤的發(fā)生,可以減少異常的使用,使得程序結(jié)構(gòu)更加簡(jiǎn)單缺點(diǎn):代碼冗余:如果多個(gè)地方需要做同樣的檢查,可能導(dǎo)致代碼重復(fù)靈活性差:預(yù)檢查方法通常針對(duì)特定的錯(cuò)誤條件,如果錯(cuò)誤類(lèi)型或檢查邏輯需要變化,可能需要更多的代碼修改錯(cuò)誤處理分散:如果檢查邏輯散布在代碼的多個(gè)部分,那么維護(hù)錯(cuò)誤處理邏輯可能變得復(fù)雜12拋出異常方法:優(yōu)點(diǎn):集中錯(cuò)誤處理:通過(guò)異??梢詫㈠e(cuò)誤處理邏輯集中在一個(gè)或幾個(gè)地方,便于維護(hù)和修改。處理意外情況:異常處理非常適合處理那些難以預(yù)料的錯(cuò)誤或程序中的非正常情況。強(qiáng)制錯(cuò)誤處理:使用異??梢詮?qiáng)制調(diào)用者處理潛在的錯(cuò)誤,特別是在API和庫(kù)設(shè)計(jì)中非常有用。缺點(diǎn):可能隱藏錯(cuò)誤:過(guò)度依賴(lài)異常可能導(dǎo)致開(kāi)發(fā)者忽視防御性編程,從而使得某些錯(cuò)誤在發(fā)生前未能被充分考慮。結(jié)論:如果錯(cuò)誤條件預(yù)期會(huì)頻繁發(fā)生,或者錯(cuò)誤檢查是程序正常流程的一部分,使用預(yù)檢查可能更合適。如果錯(cuò)誤情況較少,或者錯(cuò)誤處理需要集中管理,使用異常拋出可能更有優(yōu)勢(shì)。最佳實(shí)踐是結(jié)合使用這兩種方法:在可能的情況下進(jìn)行預(yù)檢查來(lái)避免錯(cuò)誤,同時(shí)通過(guò)異常處理來(lái)管理不可避免或未預(yù)料到的錯(cuò)誤情況13自定義異常類(lèi)自定義異常類(lèi):用于表示程序中的特定錯(cuò)誤情況,并使用raise語(yǔ)句主動(dòng)拋出自定義異常通常繼承自?xún)?nèi)置的異常類(lèi),比如Exception定義自定義異常classMyCustomError(Exception):def__init__(self,message):self.message=messagesuper().__init__(message)使用raise拋出自定義異常defcheck_age(age):ifage<18:raiseMyCustomError("年齡不足18歲")return"年齡已確認(rèn)"try:user_age=check_age(16)exceptMyCustomErrorase:print("發(fā)生異常:",e)144.斷言斷言:是一種在軟件開(kāi)發(fā)過(guò)程中提供一種快速的錯(cuò)誤識(shí)別機(jī)制.通過(guò)在代碼中插入斷言,可聲明某個(gè)條件必須為真,從而檢查程序的內(nèi)部狀態(tài)或者變量的值。如果斷言的條件計(jì)算結(jié)果為假,程序?qū)伋鲆粋€(gè)AssertionError,提示在這一點(diǎn)上存在問(wèn)題斷言assert常用于程序調(diào)試assert語(yǔ)法結(jié)構(gòu)assertexpression[,reason]當(dāng)程序處于調(diào)試(debug)狀態(tài),即設(shè)置__debug__為T(mén)rue時(shí),assert語(yǔ)句才會(huì)被執(zhí)行;否則,即程序處于發(fā)布(release)狀態(tài),該語(yǔ)句不會(huì)被執(zhí)行,從而提高程序運(yùn)行速度斷言與異常處理經(jīng)常結(jié)合使用斷言可被視為一種內(nèi)部檢查機(jī)制異常處理則用于處理程序與外部交互時(shí)可能遇到的錯(cuò)誤情況15舉例:defget_first_element(data_list):
assertlen(data_list)>0,"Thelistcannotbeempty!"returndata_list[0]data=[1,2,3,4,5]try:print("Firstelement:",get_first_element(data))exceptAssertionErroraserror:print("Error:",error)try:empty_data=[]print("Firstelement:",get_first_element(empty_data))exceptAssertionErroraserror:print("Error:",error)16上下文管理上下文管理:主要用于簡(jiǎn)化資源的管理,特別是在那些需要精確控制資源釋放的場(chǎng)景中廣泛應(yīng)用于網(wǎng)絡(luò)通信、數(shù)據(jù)庫(kù)連接、文件操作、多線程和多進(jìn)程等領(lǐng)域with語(yǔ)句的優(yōu)勢(shì)在于,它能夠保證即使在發(fā)生異常的情況下,資源也能被適當(dāng)?shù)蒯尫藕颓謇韜ith語(yǔ)句的基本語(yǔ)法結(jié)構(gòu)withcontext_expression[asvar]:with代碼塊context_expression通常是一個(gè)上下文管理器,而可選的asvar部分則是將這個(gè)管理器返回的對(duì)象賦值給變量17舉例:上下文管理舉例:以數(shù)據(jù)庫(kù)連接為例,使用with語(yǔ)句可以確保數(shù)據(jù)庫(kù)會(huì)話在使用后正確關(guān)閉,即使在數(shù)據(jù)庫(kù)操作過(guò)程中發(fā)生異常也能保證這一點(diǎn)importsqlite3#假設(shè)數(shù)據(jù)庫(kù)文件為'database.db'withsqlite3.connect('database.db')asconn:cursor=conn.cursor()cursor.execute('SELECT*FROMsome_table')forrowincursor.fetchall():print(row)with語(yǔ)句用于建立與SQLite數(shù)據(jù)庫(kù)的連接,并將連接對(duì)象賦值給變量conn。with代碼塊內(nèi)部的代碼用于執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)并處理結(jié)果。當(dāng)with代碼塊執(zhí)行完畢后,無(wú)論是正常結(jié)束還是由于異常,數(shù)據(jù)庫(kù)連接都會(huì)自動(dòng)關(guān)閉186.編程實(shí)踐例1:從文件中讀取指定行數(shù)的文本內(nèi)容首先將指定的文本內(nèi)容寫(xiě)入文件,然后根據(jù)用戶(hù)輸入,從文件中讀取指定行數(shù)。如果用戶(hù)輸入的行數(shù)大于文件中的行數(shù),程序?qū)⒆x取并輸出文件的所有內(nèi)容。該程序還需要處理可能的異常情況,包括文件寫(xiě)入時(shí)的I/O錯(cuò)誤、文件不存在錯(cuò)誤,以及用戶(hù)輸入無(wú)效數(shù)字的情況。1920defwrite_to_file(file_path,file_content):try:withopen(file_path,"w")asfile:file.write("\n".join(file_content))print(f"已成功將內(nèi)容寫(xiě)入文件'{file_path}'。")exceptIOErrorase:print(f"錯(cuò)誤:無(wú)法寫(xiě)入文件'{file_path}'。發(fā)生了I/O錯(cuò)誤:{e}")exceptExceptionase:print(f"發(fā)生了未知錯(cuò)誤:{e}")defread_file_lines(file_path,num_lines):try:withopen(file_path,"r")asfile:lines=file.readlines()ifnum_lines>len(lines):num_lines=len(lines)print(f"文件只有{len(lines)}行,顯示所有內(nèi)容:")else:print(f"文件的前{num_lines}行內(nèi)容如下:")foriinrange(num_lines):print(lines[i].strip())exceptFileNotFoundError:print(f"錯(cuò)誤:文件'{file_path}'不存在。")exceptExceptionase:print(f"發(fā)生了一個(gè)未知錯(cuò)誤:{e}")file_path="example.txt"file_content=["空山新雨后,天氣晚來(lái)秋。","明月松間照,清泉石上流。","竹喧歸浣女,蓮動(dòng)下漁舟。","隨意春芳歇,王孫自可留。"]write_to_file(file_path,file_content)try:num_lines=int(input("請(qǐng)輸入要讀取的行數(shù):"))read_file_lines(file_path,num_lines)exceptValueError:print("錯(cuò)誤:請(qǐng)輸入有效的數(shù)字。")運(yùn)行結(jié)果1(如果輸入數(shù)字2):已成功將內(nèi)容寫(xiě)入文件'example.txt'。請(qǐng)輸入要讀取的行數(shù):2文件的前2行內(nèi)容如下:空山新雨后,天氣晚來(lái)秋。明月松間照,清泉石上流。運(yùn)行結(jié)果2(如果輸入單詞two)已成功將內(nèi)容寫(xiě)入文件'example.txt'。請(qǐng)輸入要讀取的行數(shù):two錯(cuò)誤:請(qǐng)輸入有效的數(shù)字。21例2:模擬一個(gè)銀行賬戶(hù)的取款操作,使用異常處理來(lái)防止取款金額超過(guò)賬戶(hù)余額、無(wú)效的取款金額(例如負(fù)數(shù)或非數(shù)字值)和數(shù)據(jù)庫(kù)操作異常(如果涉及到數(shù)據(jù)庫(kù)交互)等情況。22#創(chuàng)建一個(gè)賬戶(hù)account=BankAccount(10000)#嘗試各種取款操作defattempt_withdrawal(amount):try:print(f"嘗試取款:{amount}")print(f"取款后余額:{account.withdraw(amount)}")exceptInsufficientFundsErrorase:print("發(fā)生錯(cuò)誤:",e)exceptInvalidAmountErrorase:print("發(fā)生錯(cuò)誤:",e)exceptDatabaseErrorase:print("發(fā)生錯(cuò)誤:",e)#嘗試各種取款情況attempt_withdrawal(15000)#超出余額attempt_withdrawal(-100)#無(wú)效金額attempt_withdrawal('abc')#無(wú)效金額attempt_withdrawal(12345)#數(shù)據(jù)庫(kù)異常attempt_withdrawal(5000)#正常取款classInvalidAmountError(Exception):passclassDatabaseError(Exception):passclassInsufficientFundsError(Exception):passclassBankAccount:def__init__(self,initial_balance):self.balance=initial_balancedefwithdraw(self,amount):
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年體育休閑廣場(chǎng)項(xiàng)目初步設(shè)計(jì)評(píng)估及景觀設(shè)計(jì)報(bào)告
- 藥品營(yíng)銷(xiāo)團(tuán)隊(duì)管理制度
- 藥品門(mén)店日常管理制度
- 藥店醫(yī)療器材管理制度
- 藥店離職衛(wèi)生管理制度
- 菜肴加工衛(wèi)生管理制度
- 設(shè)備團(tuán)隊(duì)人員管理制度
- 設(shè)備工具耗材管理制度
- 設(shè)備機(jī)房值班管理制度
- 設(shè)備電源安全管理制度
- 2024-2030年中國(guó)礦用錨桿行業(yè)發(fā)展現(xiàn)狀需求分析報(bào)告
- 護(hù)士角色轉(zhuǎn)換與適應(yīng)
- 《數(shù)據(jù)資產(chǎn)會(huì)計(jì)》 課件 第三章 數(shù)據(jù)資產(chǎn)的確認(rèn)和計(jì)量
- 2024年-2025年農(nóng)作物植保員職業(yè)技能考試題及答案
- 拍賣(mài)合同模板三篇
- 2023北京西城區(qū)初二期末(下)物理試卷及答案
- 2023-2024學(xué)年山東省煙臺(tái)市高一下學(xué)期期中生物試題(解析版)
- 淺談機(jī)械設(shè)計(jì)制造及其自動(dòng)化在飛機(jī)發(fā)動(dòng)機(jī)中的應(yīng)用
- 2024年西北工業(yè)大學(xué)附中丘成桐少年班初試數(shù)學(xué)試題真題(含答案詳解)
- 北京東城五中2025屆高三(最后沖刺)歷史試卷含解析
- 2023-2024學(xué)年浙江省衢州市開(kāi)化縣七年級(jí)(下)期中數(shù)學(xué)試卷(含答案)
評(píng)論
0/150
提交評(píng)論