文章目錄
- 一、前言
- 二、例外處理合集
- 2.1 例外處理講解
- 2.2 例外捕獲
- 2.3 例外捕獲原理
- 2.4 特定例外捕獲
- 2.5 例外捕獲的處理
- 2.6 except、Exception與BaseException
- 2.7 finally用法
- 2.8 例外資訊的列印輸出
一、前言
??本文章主要講解Python中例外介紹、捕獲、處理相關知識點內容,為后續自動化測驗框架搭建及日常維護做鋪墊,下方有系列文章的傳送門,感興趣的小伙伴也可以前往查看,話不多說,讓我們一起看看吧~
系列文章:
??系列文章1:【Python自動化測驗1】遇見Python之美
??系列文章2:【Python自動化測驗2】Python安裝配置及PyCharm基本使用
??系列文章3:【Python自動化測驗3】初識資料型別與基礎語法
??系列文章4:【Python自動化測驗4】字串知識總結
??系列文章5:【Python自動化測驗5】串列與元組知識總結
??系列文章6:【Python自動化測驗6】字典與集合知識總結
??系列文章7:【Python自動化測驗7】資料運算子知識合集
??系列文章8:【Python自動化測驗8】流程控制陳述句講解
??系列文章9:【Python自動化測驗9】函式知識合集
??系列文章10:【Python自動化測驗10】檔案基礎操作
??系列文章11:【Python自動化測驗11】模塊、包與路徑知識合集
??
二、例外處理合集
2.1 例外處理講解
??在正式介紹例外處理之前,需要先讓大家了解一個概念:編程是不可能存在完美的,總有考慮不到的情況,因為人無完人,人類是有缺陷的,更何況編程是出自人類之手,在真實專案中不要相信任何人所說的:我的代碼是完美的、這個絕對不會有問題類似的話,要知道在編程的世界里,沒有絕對的可靠,
??大家也應該清楚了,只要是人所撰寫的程式就一定會存在問題,程式不按照正常流程執行,我們就稱之為例外,例外處理顧名思義就是解決這種例外的情況,能夠讓程式正常按照邏輯和流程執行,
??
2.2 例外捕獲
??當一個程式執行報錯時會終止運行,我們進行例外處理后再次運行就不會再出現報錯,能夠捕獲到這個報錯讓程式順利運行,這個例外處理的程序我們稱之為例外捕獲,讓我們先看一個例子:
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報錯,
??
2.3 例外捕獲原理
??要解決上面的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("您的年齡輸入非法,請重新運行本程式")



??
2.4 特定例外捕獲
??特定例外捕獲顧名思義就是針對某一個出現的特定例外進行捕獲,例如我們所遇到的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("您的年齡輸入非法,請重新運行本程式")

??
2.5 例外捕獲的處理
??剛剛我們舉了一個例子,當例外捕獲為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("萬能捕手在此,束手就擒吧!")

2.6 except、Exception與BaseException
??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類派生的,常見的錯誤型別和繼承關系可以看詳細介紹 --> Python例外介紹傳送門
??
2.7 finally用法
??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()
??
2.8 例外資訊的列印輸出
??雖然我們能夠捕獲例外,但我們肯定要了解到底是什么例外,在捕獲到一個例外時我們可以進行例外資訊的列印:
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}")
??
??
??好啦~以上就是本次文章分享的全部內容啦,你學會了嗎?希望能給大家帶來幫助哦!
??
??

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414025.html
標籤:其他
上一篇:PyCharm本地連接遠程conda虛擬環境(Ubuntu+TensorFlow+GPU)進行代碼除錯+Jupyter測驗
