<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天筆者還是想要講python中的基礎,主要講解Python中異常介紹、捕獲、處理相關知識點內容,只有學好了這些才能為後續自動化測試框架搭建及日常維護做鋪墊,廢話不多說我們直接進入主題吧。
在正式介紹例外處理之前,需要先讓大家瞭解一個概念:程式設計是不可能存在完美的,總有考慮不到的情況,因為人無完人,人類是有缺陷的,更何況程式設計是出自人類之手,在真實專案中不要相信任何人所說的:我的程式碼是完美的、這個絕對不會有問題類似的話,要知道在程式設計的世界裡,沒有絕對的可靠。
大家也應該清楚了,只要是人所編寫的程式就一定會存在問題,程式不按照正常流程執行,我們就稱之為異常,例外處理顧名思義就是解決這種異常的情況,能夠讓程式正常按照邏輯和流程執行。
當一個程式執行報錯時會終止執行,我們進行例外處理後再次執行就不會再出現報錯,能夠捕獲到這個報錯讓程式順利執行,這個例外處理的過程我們稱之為異常捕獲,讓我們先看一個例子:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件")
如上程式碼所示,輸入的資料為18時,能夠正常的進行程式的邏輯計算,從而正常執行程式碼直至結束,但這樣的程式碼真的沒有問題嗎?我們再看這個例子,當輸入為abc英文字母時,出現了ValueError的錯誤,字面的意思是告訴我們出現了數值錯誤,無法將字串轉換為整型:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件")
如上圖所示,出現了ValueError報錯時,我們就可以通過異常捕獲進行處理,處理後的程式碼為:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) try: age = int(age) except: print("您的年齡輸入非法,請重新執行本程式") if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件")
如上圖所示,我們再次執行該程式並輸入abc,程式仍然無法執行,已經不是剛剛的ValueError報錯了,現在的報錯是TypeError報錯。
要解決上面的TypeError的報錯,我們先來了解下異常捕獲的原理,當正式開始一個try語句後,Python會在當前程式的上下文中作標記,當異常出現時返回標記處,try子句先執行,後續可能會發生的場景:
場景一: 如果執行try語句時發生異常,Python跳回至try並執行第一個匹配該異常的except子句,例外處理完畢,繼續執行程式碼。
場景二: 如果執行try語句時發生異常,且沒有匹配的except子句,異常將被遞交到上層的try或是程式的最上層,到此結束程式,列印錯誤資訊。
場景三: 如果在try子句執行時沒有發生異常,Python將繼續執行程式碼語句。
當我們瞭解了異常捕獲的原理後在來看下之前的TypeError報錯如何解決,字面意思型別錯誤,整型無法與字串進行比較,但實際上在此之前我們就已經對變數age進行了處理,但因為捕獲到了try的異常,執行了第一個匹配try的except子句,而子句又代替異常的語句,故此這裡的型別轉換就失效了,再次進行程式的執行就會出現型別錯誤,解決這個辦法也很簡單,只需要把判斷語句也放在try中。
當判斷語句放到try中就稍微改變了一點點,如果沒有捕獲異常,程式照常執行,判斷會生效,如果捕獲到了異常,那麼會直接跳轉到except執行輸出,提示您的年齡非法,就不會在有判斷的邏輯,因此也不會在出現TypeError的錯誤了,順帶一提,這就是我們常見的開發Bug “買一送一” ,二次修改的程式碼如下:
# 程式仍然有可優化的地方,僅展示try.. except語句的使用方式 print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) try: age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件") except: print("您的年齡輸入非法,請重新執行本程式")
特定異常捕獲顧名思義就是針對某一個出現的特定異常進行捕獲,例如我們所遇到的ValueError,如果你捕獲的是其他異常型別,那麼在程式碼執行時碰到了ValueError仍然會出現報錯:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) try: age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件") # 這裡進行捕獲的異常型別是IndexError,非ValueError,最後的結果仍然會報錯,因為沒有成功捕獲 except IndexError: print("您的年齡輸入非法,請重新執行本程式")
當捕獲的型別錯誤時,仍然會彈出報錯終止程式執行,好比一個人酒駕,那麼就應該由交警處理而不是民政局的人處理,因為那不是它的職責,異常捕獲還要講究對口,如下程式碼所示,如果設定成ValueError就能夠成功進行捕獲,就好比交警處理了酒駕一樣,完美解決:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) try: age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件") except ValueError: print("您的年齡輸入非法,請重新執行本程式")
剛剛我們舉了一個例子,當異常捕獲為IndexError時,執行程式後仍然會出現ValueError的錯誤,但我們不設定直接使用except時反而能直接捕獲,那我們還要設定它做什麼呢?想必有部分同學心中已經會產生這樣的疑問了。
except可以理解為萬能警察,萬能捕手,它可以捕獲所有的異常型別(極少數無法直接捕獲),而特定的異常捕獲只能捕獲特定出現的異常情況,我們之所以還要使用,是因為它是專門捕獲一種型別的,好比一個人有面板問題,那麼肯定是掛面板科門診要比急診科的醫生要更加專業,正所謂術業有專攻。
except因為是萬能捕手,所以它在抓獲異常後的處理方式是一樣的,好比感冒和心臟病發作兩種症狀,都是同樣的對待方式顯然是不合理的,那麼這個時候就會由特定的“醫生” (特定捕獲) 進行對應的處理方式。
目前常見的一些報錯有:ValueError、TypeError、IndexError等等,那麼在整個自動化測試的過程中,勢必會遇到很多其他的報錯,當我們不清楚其他報錯的情況下如何進行異常捕獲呢?兩種方式,第一種是錯過一次就記得了,好比一開始進行程式設計的小夥伴們,誰也不知道會遇到ValueError一樣,當碰到過一次後,下一次就會特別注意這個事情,提前做一個捕獲,俗稱踩坑。那另外一種方式就是在末尾繼續新增except,萬能捕手我們也留著,這樣當特定捕獲沒有捕獲到異常但程式出現了異常時,except就會進行捕獲:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) try: age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件") # 這裡會報錯ValueError,因為捕獲的型別是IndexError,很明顯無法進行ValueError異常捕獲,那麼我們可以在新增一個萬能捕手except來進行捕獲 except IndexError: print("您的年齡輸入非法,請重新執行本程式") # 在下面可以在進行一個except的新增: except: print("萬能捕手在此,束手就擒吧!")
except我們知道了是萬能捕手,但其實它的身份是Exception,Python預設幫我們省略了,實際上它是這樣的:
except Exception: print("萬能捕手在此,束手就擒吧!")
except與except Exception完全等價,日常的編寫時可加可不加,依據個人習慣和喜好決定即可。而BaseException是Exception的父類別,作為子類的Exception無法截獲父類別BaseException型別的錯誤。
BaseException: 包含所有built-in exceptions
Exception: 不包含所有的built-in exceptions,只包含built-in, non-system-exiting exceptions,像SystemExit型別的exception就不包含在其中。Python所有的錯誤都是從BaseException類派生的
finally的作用是無論except是否成功捕獲到了對應的異常,均需要執行finally下的程式碼:
""" 參考如下程式碼:開啟了love.txt這個檔案,進行了閱讀,又想寫入一點東西,但現在是唯讀的模式,無法進行內容寫入,故此會報錯io.UnsupportedOperation 雖然沒有寫入成功,但是這個檔案是成功讀取了的,那麼在檔案的章節中提到過,如果開啟了一個檔案要記得關閉,否則其他人無法使用 所以在finally這裡我們就可以加上f.close(),代表著無論是否有捕捉到異常,最後我都要關閉這個檔案,以確保其他人能夠正常使用該檔案 """ import io try: f = open("love.txt", encoding="utf-8", mode="r") f.read() f.write("隨便寫點~") except io.UnsupportedOperation: print("抓的就是你這個io.UnsupportedOperation報錯") finally: # finally的作用是無論except是否成功捕獲到了對應的異常,均需要執行finally下的程式碼 f.close()
雖然我們能夠捕獲異常,但我們肯定要了解到底是什麼異常,在捕獲到一個異常時我們可以進行異常資訊的列印:
print("------------------- 歡迎來到報名註冊系統 -------------------") age = (input("請輸入您的年齡:")) try: age = int(age) if age < 18: print("很遺憾,您暫時不滿足註冊條件") else: print("恭喜您符合註冊條件") # 這裡會報錯ValueError,捕獲的是IndexError,很明顯無法進行異常捕獲,那麼我們可以在新增一個萬能捕手except來進行捕獲 except IndexError as error: print("您的年齡輸入非法,請重新執行本程式") # 在這裡加一個as,後面接一個變數,然後進行變數列印即可,當出現對應的異常時就會列印對應異常的資訊 except Exception as error: print("萬能捕手在此,束手就擒吧!", f"已捕獲異常:{error}")
剛剛有提到except與except Exception是等價的,但是如果想使用as必須要使用後者,這是語法規定:
# 正確用法,在捕獲型別後加as 變數 except Exception as error: print("萬能捕手在此,束手就擒吧!", f"已捕獲異常:{error}") # 錯誤的用法,不符合語法規則 except as error: print("萬能捕手在此,束手就擒吧!", f"已捕獲異常:{error}")
到此這篇關於Python自動化測試之例外處理機制的文章就介紹到這了,更多相關Python例外處理機制內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45