




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
~1~第八章異常處理目錄異常基本概念異常處理結構主動拋出異常斷言上下文管理編程實踐本章習題-2-1.異?;靖拍町敵绦蜻\行出現錯誤時,就會產生異常(Exception)例如除以0、下標越界、文件不存在、網絡異常、類型錯誤、磁盤空間不足等軟件的發(fā)展歷史告訴我們:異常是不可避免的因此,正視異常,允許異常的產生,當異常產生了,采取適當措施處理異常即可常見的Python異常類型ValueError:當函數接收到一個具有正確類型但不適當值的參數時觸發(fā)TypeError:當操作或函數應用于不適當類型的對象時觸發(fā)IndexError:當序列中沒有此索引(index)時觸發(fā)KeyError:當字典中不存在指定的鍵時觸發(fā)ZeroDivisionError:當除數為零時觸發(fā)FileNotFoundError:當嘗試訪問不存在的文件時觸發(fā)3例1:嘗試訪問不存在的字典鍵會觸發(fā)KeyError:my_dict={'a':1,'b':2}print(my_dict['c'])#KeyError:'c’通過檢查鍵是否存在于字典中,或使用dict.get()方法,可以避免這種錯誤不適當的類型會觸發(fā)TypeError:name='StudentNO.'+1#TypeError:canonlyconcatenatestr(not"int")tostr修改為:name='StudentNo.'+str(1)42.異常處理結構語法異常:在調試(debug)程序過程中即可發(fā)現錯誤,根據系統的錯誤提示改正即可異常處理流程:但有些錯誤卻在調試時不易發(fā)現,比如網絡異常、磁盤空間不足、下標越界等,只在某些特定條件下才可能發(fā)生。通過預先設計合適的異常處理機制,程序在遇到異常情況時能夠自動執(zhí)行這些處理流程,從而有效地糾正或管理這些異常這種做法不僅提高了程序的穩(wěn)定性,而且確保了在遭遇意外情況時程序仍能平穩(wěn)運行或優(yōu)雅地終止5異常處理結構異常處理結構在Python編程中,處理異常的基礎結構是使用try...except...語句。這種結構使得開發(fā)者能夠捕捉并妥善處理在程序執(zhí)行過程中可能出現的異常,從而防止程序意外崩潰基本語法結構如下:try:#這部分是可能出現異常的代碼塊exceptException[asreason]:#這部分是當捕捉到異常時執(zhí)行的代碼塊,reason變量用于獲取異常的具體信息異常處理的邏輯如果try代碼塊中的語句運行無異常:程序將跳過except塊,繼續(xù)執(zhí)行后續(xù)代碼如果try代碼塊中出現異常,且該異常被except子句捕獲:那么程序將執(zhí)行except子句中的異常處理代碼如果try代碼塊中出現異常,但未被except捕獲:則異常會被向外拋出如果所有層次都沒有捕獲和處理該異常:程序最終將終止,并向用戶顯示異常信息6例:whileTrue:
try:x=int(input("Pleaseenteranumber:"))break
except
ValueError:print("Thisisnotavalidnumber.Pleasetryagain...")如果用戶輸入的不是數字,將產生ValueError異常7擴展的異常處理結構除了基本的try...except...結構外,還可以加入else和finally語句,以及多個except子句,形成更完整的異常處理流程擴展的語法結構try:#可能引發(fā)異常的代碼exceptException1[asreason1]:#處理第一種類型的異常exceptException2[asreason2]:#處理第二種類型的異常...else:#如果沒有異常發(fā)生,則執(zhí)行這個代碼塊finally:#無論是否發(fā)生異常,都會執(zhí)行這個代碼塊,通常用于釋放資源8例:try:#嘗試執(zhí)行的代碼,可能會產生異常
result=10/0exceptZeroDivisionError:#處理除零異常
print("不能除以零。")exceptTypeError:#處理類型錯誤異常
print("類型錯誤。")else:#如果沒有異常發(fā)生
print("操作成功。")finally:#無論是否發(fā)生異常
print("操作完成。")93.主動拋出異常raise語句:允許程序員強制觸發(fā)指定的異常,這在需要明確指出錯誤條件或強制執(zhí)行特定錯誤處理邏輯時非常有用基本語法結構:raiseExceptionType("錯誤信息")ExceptionType是要拋出的異常類型,如ValueError,TypeError等,而“錯誤信息”則是提供給異常處理器的額外信息10舉例:數據通信在數據通信中,確保所有的操作都在有效連接上執(zhí)行非常關鍵。如果嘗試在尚未建立或已關閉的連接上發(fā)送數據,可能會導致程序錯誤或數據丟失。為了管理這種潛在的錯誤并增強程序的健壯性,開發(fā)者可以采用異常處理機制來明確地監(jiān)控和響應連接狀態(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函數在發(fā)送數據前檢查網絡連接是否開啟,如果連接沒有開啟,則拋出ConnectionError11兩種錯誤管理策略兩種常見的錯誤管理策略:使用預檢查和拋出異常處理預檢查方法:send_data(data,connection):ifnotconnection.is_open():print("Connectionisnotopen.")returnconnection.send(data)connection=NetworkConnection()send_data("Hello",connection)優(yōu)點:直觀和顯式:代碼中直接檢查條件,如連接狀態(tài),可以讓代碼的邏輯更加明確和直觀防御性編程:通過預檢查防止錯誤的發(fā)生,可以減少異常的使用,使得程序結構更加簡單缺點:代碼冗余:如果多個地方需要做同樣的檢查,可能導致代碼重復靈活性差:預檢查方法通常針對特定的錯誤條件,如果錯誤類型或檢查邏輯需要變化,可能需要更多的代碼修改錯誤處理分散:如果檢查邏輯散布在代碼的多個部分,那么維護錯誤處理邏輯可能變得復雜12拋出異常方法:優(yōu)點:集中錯誤處理:通過異??梢詫㈠e誤處理邏輯集中在一個或幾個地方,便于維護和修改。處理意外情況:異常處理非常適合處理那些難以預料的錯誤或程序中的非正常情況。強制錯誤處理:使用異??梢詮娭普{用者處理潛在的錯誤,特別是在API和庫設計中非常有用。缺點:可能隱藏錯誤:過度依賴異??赡軐е麻_發(fā)者忽視防御性編程,從而使得某些錯誤在發(fā)生前未能被充分考慮。結論:如果錯誤條件預期會頻繁發(fā)生,或者錯誤檢查是程序正常流程的一部分,使用預檢查可能更合適。如果錯誤情況較少,或者錯誤處理需要集中管理,使用異常拋出可能更有優(yōu)勢。最佳實踐是結合使用這兩種方法:在可能的情況下進行預檢查來避免錯誤,同時通過異常處理來管理不可避免或未預料到的錯誤情況13自定義異常類自定義異常類:用于表示程序中的特定錯誤情況,并使用raise語句主動拋出自定義異常通常繼承自內置的異常類,比如Exception定義自定義異常classMyCustomError(Exception):def__init__(self,message):self.message=messagesuper().__init__(message)使用raise拋出自定義異常defcheck_age(age):ifage<18:raiseMyCustomError("年齡不足18歲")return"年齡已確認"try:user_age=check_age(16)exceptMyCustomErrorase:print("發(fā)生異常:",e)144.斷言斷言:是一種在軟件開發(fā)過程中提供一種快速的錯誤識別機制.通過在代碼中插入斷言,可聲明某個條件必須為真,從而檢查程序的內部狀態(tài)或者變量的值。如果斷言的條件計算結果為假,程序將拋出一個AssertionError,提示在這一點上存在問題斷言assert常用于程序調試assert語法結構assertexpression[,reason]當程序處于調試(debug)狀態(tài),即設置__debug__為True時,assert語句才會被執(zhí)行;否則,即程序處于發(fā)布(release)狀態(tài),該語句不會被執(zhí)行,從而提高程序運行速度斷言與異常處理經常結合使用斷言可被視為一種內部檢查機制異常處理則用于處理程序與外部交互時可能遇到的錯誤情況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上下文管理上下文管理:主要用于簡化資源的管理,特別是在那些需要精確控制資源釋放的場景中廣泛應用于網絡通信、數據庫連接、文件操作、多線程和多進程等領域with語句的優(yōu)勢在于,它能夠保證即使在發(fā)生異常的情況下,資源也能被適當地釋放和清理with語句的基本語法結構withcontext_expression[asvar]:with代碼塊context_expression通常是一個上下文管理器,而可選的asvar部分則是將這個管理器返回的對象賦值給變量17舉例:上下文管理舉例:以數據庫連接為例,使用with語句可以確保數據庫會話在使用后正確關閉,即使在數據庫操作過程中發(fā)生異常也能保證這一點importsqlite3#假設數據庫文件為'database.db'withsqlite3.connect('database.db')asconn:cursor=conn.cursor()cursor.execute('SELECT*FROMsome_table')forrowincursor.fetchall():print(row)with語句用于建立與SQLite數據庫的連接,并將連接對象賦值給變量conn。with代碼塊內部的代碼用于執(zhí)行數據庫查詢并處理結果。當with代碼塊執(zhí)行完畢后,無論是正常結束還是由于異常,數據庫連接都會自動關閉186.編程實踐例1:從文件中讀取指定行數的文本內容首先將指定的文本內容寫入文件,然后根據用戶輸入,從文件中讀取指定行數。如果用戶輸入的行數大于文件中的行數,程序將讀取并輸出文件的所有內容。該程序還需要處理可能的異常情況,包括文件寫入時的I/O錯誤、文件不存在錯誤,以及用戶輸入無效數字的情況。1920defwrite_to_file(file_path,file_content):try:withopen(file_path,"w")asfile:file.write("\n".join(file_content))print(f"已成功將內容寫入文件'{file_path}'。")exceptIOErrorase:print(f"錯誤:無法寫入文件'{file_path}'。發(fā)生了I/O錯誤:{e}")exceptExceptionase:print(f"發(fā)生了未知錯誤:{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)}行,顯示所有內容:")else:print(f"文件的前{num_lines}行內容如下:")foriinrange(num_lines):print(lines[i].strip())exceptFileNotFoundError:print(f"錯誤:文件'{file_path}'不存在。")exceptExceptionase:print(f"發(fā)生了一個未知錯誤:{e}")file_path="example.txt"file_content=["空山新雨后,天氣晚來秋。","明月松間照,清泉石上流。","竹喧歸浣女,蓮動下漁舟。","隨意春芳歇,王孫自可留。"]write_to_file(file_path,file_content)try:num_lines=int(input("請輸入要讀取的行數:"))read_file_lines(file_path,num_lines)exceptValueError:print("錯誤:請輸入有效的數字。")運行結果1(如果輸入數字2):已成功將內容寫入文件'example.txt'。請輸入要讀取的行數:2文件的前2行內容如下:空山新雨后,天氣晚來秋。明月松間照,清泉石上流。運行結果2(如果輸入單詞two)已成功將內容寫入文件'example.txt'。請輸入要讀取的行數:two錯誤:請輸入有效的數字。21例2:模擬一個銀行賬戶的取款操作,使用異常處理來防止取款金額超過賬戶余額、無效的取款金額(例如負數或非數字值)和數據庫操作異常(如果涉及到數據庫交互)等情況。22#創(chuàng)建一個賬戶account=BankAccount(10000)#嘗試各種取款操作defattempt_withdrawal(amount):try:print(f"嘗試取款:{amount}")print(f"取款后余額:{account.withdraw(amount)}")exceptInsufficientFundsErrorase:print("發(fā)生錯誤:",e)exceptInvalidAmountErrorase:print("發(fā)生錯誤:",e)exceptDatabaseErrorase:print("發(fā)生錯誤:",e)#嘗試各種取款情況attempt_withdrawal(15000)#超出余額attempt_withdrawal(-100)#無效金額attempt_withdrawal('abc')#無效金額attempt_withdrawal(12345)#數據庫異常attempt_withdrawal(5000)#正常取款classInvalidAmountError(Exception):passclassDatabaseError(Exception):passclassInsufficientFundsError(Exception):passclassBankAccount:def__init__(self,initial_balance):self.balance=initial_balancedefwithdraw(self,amount):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術品市場行業(yè)規(guī)范建設考核試卷
- 鐵路職工職業(yè)素養(yǎng)與維護意識培養(yǎng)考核試卷
- 突發(fā)心肌梗塞急救方法
- 器官移植麻醉核心要點
- 外科疼痛規(guī)范化管理與患者教育
- 外科切口護理
- 低體溫新生兒護理
- 2025年天然氣管道建設社會穩(wěn)定風險評估與風險評估實踐總結與展望報告
- 2025年即時配送行業(yè)配送路徑優(yōu)化與成本控制創(chuàng)新方案報告
- 2025年教育精準扶貧中的師資隊伍建設與提升路徑報告
- 招投標員測試題及答案
- 工廠顏色標識管理制度
- 校園電腦維修團創(chuàng)業(yè)項目計劃書(正式)
- 租房學位合同協議書范本
- 艾梅乙考試試題及答案
- 合肥市公安局招聘警務輔助人員考試真題2024
- T/CECS 10363-2024薄壁不銹鋼管件用法蘭及法蘭接頭
- 2025年MySQL數據庫編程試題及答案
- DB32-T 5119-2025 鋰離子電池工廠生產安全技術規(guī)范
- 醫(yī)院信息安全法律培訓計劃
- 國開學習網《員工勞動關系管理》形考任務1-4答案
評論
0/150
提交評論