新手常見(jiàn)Python錯(cuò)誤及異常解決處理方案
寫(xiě)Python代碼的小伙伴不可避免地會(huì)遇到代碼執(zhí)行錯(cuò)誤和異常,這次就來(lái)詳細(xì)且不失通俗地總結(jié)一下python中的錯(cuò)誤和異常。
先拋出兩個(gè)問(wèn)題:
什么是Python錯(cuò)誤和異常?
如何處理Python錯(cuò)誤和異常?
1.語(yǔ)法錯(cuò)誤可能是初學(xué)者最常遇到的,如下面熟悉的畫(huà)面:
SyntaxError: invalid syntax語(yǔ)法錯(cuò)誤又稱(chēng)解析錯(cuò)誤,又有老哥會(huì)問(wèn)什么是解析錯(cuò)誤?簡(jiǎn)單來(lái)說(shuō)是基本語(yǔ)法結(jié)構(gòu)寫(xiě)錯(cuò)了,如:多任務(wù)寫(xiě)成一行、for循環(huán)沒(méi)加‘:'等。如下:
多任務(wù)寫(xiě)成一行
for循環(huán)沒(méi)加‘:'
上面示例可以看到,針對(duì)語(yǔ)法錯(cuò)誤,python解析器會(huì)輸出錯(cuò)誤的那一行,并且在最先找到的錯(cuò)誤的位置標(biāo)記了一個(gè)箭頭。
熟悉python語(yǔ)法后,可以避免語(yǔ)法錯(cuò)誤,但是代碼常會(huì)發(fā)生異常(Exception)。還是兩個(gè)問(wèn)題:
2.異常是什么?
異常和語(yǔ)法錯(cuò)誤有什么區(qū)別呢?
關(guān)于異常,舉個(gè)例子:
這行代碼出現(xiàn)異常,因?yàn)镻rint的p應(yīng)該小寫(xiě):
python拋出異常類(lèi)型:NameError,即名字錯(cuò)誤。
其它異常的例子:
可以看到,異常有不同的類(lèi)型,發(fā)生異常后,其類(lèi)型名稱(chēng)會(huì)被打印出來(lái)。上述這些都是python內(nèi)置的異常,用戶(hù)也可以自定義異常,這里不做贅述。
3、try...except...語(yǔ)句
有python編程經(jīng)驗(yàn)的人會(huì)知道,python里用try...except...語(yǔ)句來(lái)處理異常情況。
先看個(gè)異常處理的示例:
看,我們完美地捕捉到了程序中的異常。
結(jié)合上面的示例,處理異常的規(guī)則是:把執(zhí)行的語(yǔ)句放在 try 代碼塊中,將錯(cuò)誤處理器代碼放置在 except 代碼塊中,except會(huì)引發(fā)ZeroDivisionError異常來(lái)提醒Coder,這段代碼的錯(cuò)誤是零不能作為被除數(shù)。
except后面也可以不添加異常類(lèi)型,會(huì)捕獲所有出現(xiàn)的異常:
我們可以把try...except...原理歸納為幾個(gè)要點(diǎn):
- 首先,執(zhí)行 try 子句 (try 和 except 關(guān)鍵字之間的(多行)語(yǔ)句)
- 如果沒(méi)有異常發(fā)生,則跳過(guò) except 子句 并完成 try 語(yǔ)句的執(zhí)行
- 如果在執(zhí)行try 子句時(shí)發(fā)生了異常,則跳過(guò)該子句中剩下的部分。然后,如果異常的類(lèi)型和 except 關(guān)鍵字后面的異常匹配,則執(zhí)行 except 子句 ,然后繼續(xù)執(zhí)行 try 語(yǔ)句之后的代碼
如果發(fā)生的異常和 except 子句中指定的異常不匹配,則將其傳遞到外部的 try 語(yǔ)句中;如果沒(méi)有找到處理程序,則它是一個(gè)未處理異常,執(zhí)行將停止并顯示如上所示的消息
4、多個(gè)except子句
上面的try...except...語(yǔ)句只處理了一種異常,如果我想多匹配幾個(gè)異常類(lèi)型,怎么辦呢?
這里就需要多個(gè)except子句來(lái)幫忙了,舉個(gè)例子:
引發(fā)異常ZeroDivisionError
引發(fā)異常TypeError
上面我們用了兩個(gè)except,匹配ZeroDivisionError和TypeError這兩種異常,第一個(gè)代碼捕捉到了ZeroDivisionError,第二段代碼捕捉到了TypeError異常,一個(gè)都沒(méi)有漏。
當(dāng)然你還可以這樣寫(xiě):
也就是用一個(gè)except捕捉多個(gè)異常,異常類(lèi)型放到except后面的元組里。
綜上,對(duì)于多個(gè)except子句,可以總結(jié)為:
一個(gè)try語(yǔ)句可能有多個(gè) except 子句,以指定不同異常的處理程序
最多會(huì)執(zhí)行一個(gè)處理程序
處理程序只處理相應(yīng)的 try 子句中發(fā)生的異常,而不處理同一try語(yǔ)句內(nèi)其他處理程序中的異常
一個(gè) except 子句可以將多個(gè)異常命名為帶括號(hào)的元組
5、try...except Exception as e語(yǔ)句
我們常常會(huì)看看這樣的寫(xiě)法:
try...exceptException as e其中的e代表什么意思呢?
再舉個(gè)例子:
通過(guò)示例可以知道,e輸出了異常類(lèi)型。
也就是說(shuō),Exception匹配了所有異常,把異常名稱(chēng)賦給了e。
當(dāng)然這里不一定非得是e,你可以取任何的變量名,只是約定俗稱(chēng)這樣寫(xiě)罷了。
6、try...except...finally語(yǔ)句
try...except...finally語(yǔ)句可能并不那么常見(jiàn),但它是非常有用的。
如果說(shuō),我想用python打開(kāi)了一個(gè)txt文件,然后讀取,寫(xiě)入,最后關(guān)閉文件對(duì)象。這是一套常規(guī)流程,如果我想捕捉代碼過(guò)程中的異常,又要保證無(wú)論是否有異常,最后都必須要關(guān)閉文件。這時(shí)候就用到finally,看下面例子:
上面代碼,既捕捉到了異常,最終又關(guān)閉了文件對(duì)象。
finaly的作用是,無(wú)論except是否捕捉到異常,
finally后面的代碼都會(huì)執(zhí)行,try獲取了資源,
finally釋放資源,保證了收尾工作。
7、with...語(yǔ)句
with...語(yǔ)句是try-finally語(yǔ)句的簡(jiǎn)寫(xiě),可以替代try-finally的功能。
表達(dá)式open('poem.txt')返回是一個(gè)_io.TextIOWrapper 類(lèi)型的變量賦給f。
在with語(yǔ)句塊中就可以使用這個(gè)變量操作文件。
執(zhí)行with這個(gè)結(jié)構(gòu)之后,f會(huì)自動(dòng)關(guān)閉,相當(dāng)于自帶了一個(gè)finally。
8、總結(jié)
本文詳細(xì)且清晰地講解了Python中錯(cuò)誤和異常的概念及其處理方式,
通過(guò)具體案例展示try...except、try...finally、with...等句式的具體用法,
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python運(yùn)行的17個(gè)時(shí)新手常見(jiàn)錯(cuò)誤小結(jié)
- Python eval的常見(jiàn)錯(cuò)誤封裝及利用原理詳解
- Python初學(xué)者常見(jiàn)錯(cuò)誤詳解
- Python常見(jiàn)錯(cuò)誤:IndexError:?list?index?out?of?range解決
- python中常見(jiàn)錯(cuò)誤及解決方法
- Python3環(huán)境安裝Scrapy爬蟲(chóng)框架過(guò)程及常見(jiàn)錯(cuò)誤
- Python全局變量與global關(guān)鍵字常見(jiàn)錯(cuò)誤解決方案
- Python常見(jiàn)錯(cuò)誤類(lèi)型及解決方法
- Python常見(jiàn)的錯(cuò)誤以及其解決方案
相關(guān)文章
PyCharm使用之配置SSH Interpreter的方法步驟
這篇文章主要介紹了PyCharm使用之配置SSH Interpreter的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12深入了解Python中反射和動(dòng)態(tài)屬性的無(wú)限可能
理解 Python 中的反射和動(dòng)態(tài)屬性是編寫(xiě)靈活和強(qiáng)大程序的關(guān)鍵,在這篇文章中,小編將帶領(lǐng)大家一起反射和動(dòng)態(tài)屬性的概念,并提供大量示例代碼,希望對(duì)大家有所幫助2023-11-11解決django 向mysql中寫(xiě)入中文字符出錯(cuò)的問(wèn)題
這篇文章主要介紹了解決django 向mysql中寫(xiě)入中文字符出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例
這篇文章主要介紹了keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06pandas之分組groupby()的使用整理與總結(jié)
這篇文章主要介紹了pandas之分組groupby()的使用整理與總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06python的列表生成式,生成器和generator對(duì)象你了解嗎
這篇文章主要為大家詳細(xì)介紹了python的列表生成式,生成器和generator對(duì)象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03淺談python 里面的單下劃線(xiàn)與雙下劃線(xiàn)的區(qū)別
這篇文章主要介紹了淺談python 里面的單下劃線(xiàn)與雙下劃線(xiàn)的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12