網(wǎng)站首頁 編程語言 正文
前言
我們是人,也會經(jīng)常犯錯(cuò),程序員也不例外,就算是經(jīng)驗(yàn)豐富的碼農(nóng),也不能保證寫的代碼百分之百沒有任何問題。另外,作為一個(gè)合格的程序員,在編程時(shí)要意識到一點(diǎn),那就是永遠(yuǎn)不要相信你的用戶,所以要多方面考慮,這樣寫出來的程序才會更加安全穩(wěn)定。
那么既然程序總會出問題,那我們就需要用適當(dāng)?shù)姆椒ㄈソ鉀Q問題。程序出現(xiàn)邏輯錯(cuò)誤或者用戶輸入不合法都會引發(fā)異常,但這些異常并不是致命的,不會導(dǎo)致程序崩潰,可以利用Python提供的異常處理機(jī)制,在異常出現(xiàn)的時(shí)候及時(shí)捕獲,并從內(nèi)部自我消化掉。
那么什么是異常呢?舉個(gè)例子:
這里當(dāng)然假設(shè)用戶的輸入是正確的,但是只要用戶輸入一個(gè)不存在的文件名,那么上面的代碼是不堪一擊的:
上面的例子就拋出了一個(gè)FileNotFoundError異常,那么Python還可能拋出哪些異常呢,在下面給大家介紹一下常見的異常,這樣以后遇到這樣的異常時(shí)就不會感到陌生了。
一、常見的Python異常
AssertionError:斷言語句(assert)失敗
在以前的分支和循環(huán)章節(jié)中講過斷言語句(assert),當(dāng)assert這個(gè)關(guān)鍵字后邊的條件為假的時(shí)候,程序?qū)⒔K止并拋出AssertionError異常。assert語句一般是在測試程序的時(shí)候用于在代碼中置入檢查點(diǎn):
AttributeError:嘗試訪問未知的對象屬性
當(dāng)試圖訪問的對象屬性不存在時(shí)拋出的異常:
IndexError:索引超出序列的范圍
在使用序列的時(shí)候就常常會遇到IndexError異常,原因是索引超出序列范圍的內(nèi)容:
KeyError:字典查找一個(gè)不存在的關(guān)鍵字
當(dāng)試圖在字典中查找一個(gè)不存在的關(guān)鍵字時(shí)就會引發(fā)KeyError異常,因此建議使用dict.get()方法:
NameError:嘗試訪問一個(gè)不存在的變量
當(dāng)嘗試訪問一個(gè)不存在的變量時(shí),Python會拋出NameError異常:
OSError:操作系統(tǒng)產(chǎn)生的異常
OSError顧名思義就是操作系統(tǒng)產(chǎn)生的異常,像打開一個(gè)不存在的文件會引發(fā)FileNotFoundError,而這個(gè)FileNotFoundError就是OSError的子類。上面的例子已經(jīng)演示過,這里就不再贅述了。
SyntaxError:Python的語法錯(cuò)誤
如果遇到SyntaxError是Python的語法錯(cuò)誤,這時(shí)Python的代碼并不能繼續(xù)執(zhí)行,你應(yīng)該找到并改正錯(cuò)誤:
TypeError:不同類型間的無效操作
有些類型不同是不能相互進(jìn)行計(jì)算的,否則會拋出TypeError異常:
ZeroDivisionError:除數(shù)為零
我們都知道除數(shù)不能為零,所以除以零就會引發(fā)ZeroDivisionError異常:
二、try-except語句
try-except語句格式如下:
try:
??檢測范圍
except Exception[as reason]:
??出現(xiàn)異常(Exception)后的處理代碼
try-except語句用于檢測和處理異常,舉個(gè)例子來說明這一切是如何工作的。
前面我們也介紹過,當(dāng)要打開的文件不存在時(shí),就會引發(fā)FileNotFoundError,顯然用戶的體驗(yàn)不好,因此我們可以這樣修改:
其執(zhí)行結(jié)果是:
上面的例子由于使用了大家習(xí)慣的語言來描述錯(cuò)誤信息,用戶體驗(yàn)會好很多。
但是從程序員的角度來看,導(dǎo)致OSError異常的原因有很多(例如FileNotFoundError、FileExistsError、PermissionError等),所以可能會更在意錯(cuò)誤的具體內(nèi)容,這里可以使用as把具體的錯(cuò)誤消息打印出來:
其執(zhí)行結(jié)果為:
針對不同異常設(shè)置多個(gè)except
一個(gè)try語句可以和多個(gè)except語句搭配,分別對感興趣的異常進(jìn)行檢測處理:
三、對多個(gè)異常統(tǒng)一處理
except后面還可以跟多個(gè)異常,然后對這些異常進(jìn)行統(tǒng)一的處理:
四、捕獲所有異常
如果你無法確定要對哪一類異常進(jìn)行處理,只是希望在try語句塊里一旦出現(xiàn)任何異常,可以給用戶一個(gè)“看得懂”的提醒,那么可以這么做:
五、try-finally語句
看下面這個(gè)例子,如果"a.txt"確實(shí)存在,open()函數(shù)可以正常返回文件對象,但異常卻發(fā)生在打開文件后的sum = 1 + ‘1’語句上,此時(shí)Python將直接跳到except語句,也就是說,文件打開了,但并沒有執(zhí)行關(guān)閉文件的命令:
為了實(shí)現(xiàn)這種“就算出現(xiàn)異常,但也不得不執(zhí)行的收尾工作(比如在程序崩潰前保存用戶文檔)”,引入了finally來擴(kuò)展try:
如果try語句塊中沒有出現(xiàn)任何運(yùn)行時(shí)錯(cuò)誤,會跳過except語句執(zhí)行finally語句塊的內(nèi)容。
如果出現(xiàn)異常,則會先執(zhí)行except語句塊的內(nèi)容再執(zhí)行finally語句塊的內(nèi)容。
總之,finally語句塊中的內(nèi)容就是確保無論如何都將被執(zhí)行的內(nèi)容。
六、raise語句
有些讀者可能會思考,我的代碼能不能自己拋出一個(gè)異常呢?答案是可以的,你可以使用raise語句拋出一個(gè)異常:
拋出的異常還可以帶參數(shù),表示異常的解釋:
七、豐富的else語句
對于絕大多數(shù)編程語言來說,else語句都只能跟if語句搭配,但是在Python里,else語句的功能更加豐富。在Python中,else語句不僅能跟if語句搭,跟循環(huán)語句(for語句或while語句)搭配,還能跟剛才所講的異常處理進(jìn)行搭配。
1、典型的if-else語句
if 條件:
? 條件為真執(zhí)行
else:
? 條件為假執(zhí)行
2、else與for和while循環(huán)語句搭配
舉個(gè)例子:
這段程序主要是求用戶輸入的數(shù)的最大約數(shù),如果是素?cái)?shù)的話會提醒這是一個(gè)素?cái)?shù)。
使用暴力的方法一個(gè)個(gè)嘗試(num%count==0),如果符合條件則打印出最大的約數(shù),并break,同時(shí)不會執(zhí)行else語句塊的內(nèi)容了。但如果一直沒有遇到合適的條件,則會執(zhí)行else語句塊內(nèi)容。
for語句的用法和while語句一樣,這里便不再贅述了。
3、else語句與異常處理進(jìn)行搭配
else語句還能和剛剛講的異常處理進(jìn)行搭配,只要try語句塊里沒有出現(xiàn)任何異常,那么就會執(zhí)行else語句塊里的內(nèi)容。
舉個(gè)例子:
八、簡潔的with語句
有些讀者覺得打開文件又要關(guān)閉文件,還要關(guān)注異常處理有點(diǎn)麻煩,所以Python提供了一個(gè)with語句,利用這個(gè)語句抽象出文件操作中頻繁使用的try/except/finally相關(guān)的細(xì)節(jié),對文件操作使用with語句,將大大減少代碼量。
舉個(gè)例子:
使用with語句,可以改成這樣:
有了with語句,就再也不用擔(dān)心忘記關(guān)閉文件了。
原文鏈接:https://blog.csdn.net/weixin_44162361/article/details/125500506
相關(guān)推薦
- 2022-06-01 Python寫一個(gè)字符串?dāng)?shù)字后綴部分的遞增函數(shù)_python
- 2022-10-20 Python?BautifulSoup?節(jié)點(diǎn)信息_python
- 2022-08-11 python中@Property屬性使用方法_python
- 2022-09-20 以SortedList為例詳解Python的defaultdict對象使用自定義類型的方法_pyth
- 2022-05-11 django配置DJANGO_SETTINGS_MODULE的實(shí)現(xiàn)_python
- 2023-09-17 adb shell cmd wifi(系統(tǒng)服務(wù):wifi)
- 2023-01-19 GO語言的數(shù)組array與切片slice詳解_Golang
- 2022-08-28 centos 單機(jī)版redis安裝與數(shù)據(jù)持久化
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支