Python常見異常類型處理
前言:
開發(fā)人員在編寫程序時(shí),難免會(huì)遇到錯(cuò)誤,有的是編寫人員疏忽造成的語(yǔ)法錯(cuò)誤,有的是程序內(nèi)部隱含邏輯問(wèn)題造成的數(shù)據(jù)錯(cuò)誤,還有的是程序運(yùn)行時(shí)與系統(tǒng)的規(guī)則沖突造成的系統(tǒng)錯(cuò)誤,等等。
總的來(lái)說(shuō),編寫程序時(shí)遇到的錯(cuò)誤可大致分為 2 類,分別為語(yǔ)法錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤。
1.Python語(yǔ)法錯(cuò)誤
語(yǔ)法錯(cuò)誤,也就是解析代碼時(shí)出現(xiàn)的錯(cuò)誤。當(dāng)代碼不符合 Python
語(yǔ)法規(guī)則時(shí),Python
解釋器在解析時(shí)就會(huì)報(bào)出 SyntaxError
語(yǔ)法錯(cuò)誤,與此同時(shí)還會(huì)明確指出最早探測(cè)到錯(cuò)誤的語(yǔ)句。
例如:
print "Hello,World!"
我們知道,Python 3
已不再支持上面這種寫法,所以在運(yùn)行時(shí),解釋器會(huì)報(bào)如下錯(cuò)誤:
SyntaxError: Missing parentheses in call to 'print'
語(yǔ)法錯(cuò)誤多是開發(fā)者疏忽導(dǎo)致的,屬于真正意義上的錯(cuò)誤,是解釋器無(wú)法容忍的,因此,只有將程序中的所有語(yǔ)法錯(cuò)誤全部糾正,程序才能執(zhí)行。
2.Python運(yùn)行時(shí)錯(cuò)誤
運(yùn)行時(shí)錯(cuò)誤,即程序在語(yǔ)法上都是正確的,但在運(yùn)行時(shí)發(fā)生了錯(cuò)誤。
例如:
a = 1/0
上面這句代碼的意思是“用 1 除以 0,并賦值給 a 。
因?yàn)?0 作除數(shù)是沒(méi)有意義的,所以運(yùn)行后會(huì)產(chǎn)生如下錯(cuò)誤:
>>> a = 1/0 Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> a = 1/0 ZeroDivisionError: division by zero
以上運(yùn)行輸出結(jié)果中,前兩段指明了錯(cuò)誤的位置,最后一句表示出錯(cuò)的類型。在 Python 中,把這種運(yùn)行時(shí)產(chǎn)生錯(cuò)誤的情況叫做異常(Exceptions
)。這種異常情況還有很多,常見的幾種異常情況如表 1 所示
表 1 Python常見異常類型:
異常類型 | 含義 | 實(shí)例 |
---|---|---|
AssertionError | 當(dāng) assert 關(guān)鍵字后的條件為假時(shí),程序運(yùn)行會(huì)停止并拋出 AssertionError 異常 | >>> demo_list = ['C語(yǔ)言中文網(wǎng)'] >>> assert len(demo_list) > 0 >>> demo_list.pop() 'C語(yǔ)言中文網(wǎng)' >>> assert len(demo_list) > 0 Traceback (most recent call last): ? File "<pyshell#6>", line 1, in <module> ??? assert len(demo_list) > 0 AssertionError |
AttributeError | 當(dāng)試圖訪問(wèn)的對(duì)象屬性不存在時(shí)拋出的異常 | >>> demo_list = ['C語(yǔ)言中文網(wǎng)'] >>> demo_list.len Traceback (most recent call last): ? File "<pyshell#10>", line 1, in <module> ??? demo_list.len AttributeError: 'list' object has no attribute 'len' |
IndexError | 索引超出序列范圍會(huì)引發(fā)此異常 | >>> demo_list = ['C語(yǔ)言中文網(wǎng)'] >>> demo_list[3] Traceback (most recent call last): ? File "<pyshell#8>", line 1, in <module> ??? demo_list[3] IndexError: list index out of range |
KeyError | 字典中查找一個(gè)不存在的關(guān)鍵字時(shí)引發(fā)此異常 | >>> demo_dict={'C語(yǔ)言中文網(wǎng)':"c.biancheng.net"} >>> demo_dict["C語(yǔ)言"] Traceback (most recent call last): ? File "<pyshell#12>", line 1, in <module> ??? demo_dict["C語(yǔ)言"] KeyError: 'C語(yǔ)言' |
NameError | 嘗試訪問(wèn)一個(gè)未聲明的變量時(shí),引發(fā)此異常 | >>> C語(yǔ)言中文網(wǎng) Traceback (most recent call last): ? File "<pyshell#15>", line 1, in <module> ??? C語(yǔ)言中文網(wǎng) NameError: name 'C語(yǔ)言中文網(wǎng)' is not defined |
TypeError | 不同類型數(shù)據(jù)之間的無(wú)效操作 | >>> 1+'C語(yǔ)言中文網(wǎng)' Traceback (most recent call last): ? File "<pyshell#17>", line 1, in <module> ??? 1+'C語(yǔ)言中文網(wǎng)' TypeError: unsupported operand type(s) for +: 'int' and 'str' |
ZeroDivisionError | 除法運(yùn)算中除數(shù)為 0 引發(fā)此異常 | >>> a = 1/0 Traceback (most recent call last): ? File "<pyshell#2>", line 1, in <module> ??? a = 1/0 ZeroDivisionError: division by zero |
提示:表中的異常類型不需要記住,只需簡(jiǎn)單了解即可。
當(dāng)一個(gè)程序發(fā)生異常時(shí),代表該程序在執(zhí)行時(shí)出現(xiàn)了非正常的情況,無(wú)法再執(zhí)行下去。默認(rèn)情況下,程序是要終止的。如果要避免程序退出,可以使用捕獲異常的方式獲取這個(gè)異常的名稱,再通過(guò)其他的邏輯代碼讓程序繼續(xù)運(yùn)行,這種根據(jù)異常做出的邏輯處理叫作異常處理。
開發(fā)者可以使用異常處理全面地控制自己的程序。異常處理不僅僅能夠管理正常的流程運(yùn)行,還能夠在程序出錯(cuò)時(shí)對(duì)程序進(jìn)行必的處理。大大提高了程序的健壯性和人機(jī)交互的友好性。
到此這篇關(guān)于Python常見異常類型處理的文章就介紹到這了,更多相關(guān)Python異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)批量下載文件的示例代碼
下載文件是我們?cè)谌粘9ぷ髦谐3R龅囊患虑?當(dāng)我們需要從互聯(lián)網(wǎng)上批量下載大量文件時(shí),手動(dòng)一個(gè)一個(gè)去下載顯然不夠高效,所以本文為大家介紹一下如何利用python批量下載文件吧2023-11-11python中使用smtplib和email模塊發(fā)送郵件實(shí)例
python腳本發(fā)郵件,一般會(huì)用到smtplib和email這兩個(gè)模塊??纯丛撃K怎么使用,先看smtplib模塊。 smtplib模塊定義了一個(gè)簡(jiǎn)單的SMTP客戶端,可以用來(lái)在互聯(lián)網(wǎng)上發(fā)送郵件2014-04-04Python使用FTP上傳文件的實(shí)現(xiàn)示例
本文主要介紹了Python使用FTP上傳文件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python?rsa和Crypto.PublicKey.RSA?模塊詳解
這篇文章主要介紹了python?rsa和Crypto.PublicKey.RSA?模塊,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04python爬取百度貼吧前1000頁(yè)內(nèi)容(requests庫(kù)面向?qū)ο笏枷雽?shí)現(xiàn))
這篇文章主要介紹了python爬取百度貼吧前1000頁(yè)內(nèi)容(requests庫(kù)面向?qū)ο笏枷雽?shí)現(xiàn)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python爬蟲 urllib模塊發(fā)起post請(qǐng)求過(guò)程解析
這篇文章主要介紹了python爬蟲 urllib模塊發(fā)起post請(qǐng)求過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08