python常見(jiàn)異常類(lèi)型
在程序運(yùn)行過(guò)程中,總會(huì)遇到各種各樣的問(wèn)題和錯(cuò)誤。
有些錯(cuò)誤是我們編寫(xiě)代碼時(shí)自己造成的,比如語(yǔ)法錯(cuò)誤、調(diào)用錯(cuò)誤,甚至邏輯錯(cuò)誤。下面這個(gè)例子,在輸入 if 后輸入回車(chē)了,沒(méi)有按照 Python 的語(yǔ)法規(guī)則來(lái),所以直接拋出了語(yǔ)法錯(cuò)誤。
>>> if
File "", line 1
if
^
SyntaxError: invalid syntax
還有一些錯(cuò)誤,則是不可預(yù)料的錯(cuò)誤,但是完全有可能發(fā)生的,比如文件不存在、磁盤(pán)空間不足、網(wǎng)絡(luò)堵塞、系統(tǒng)錯(cuò)誤等等。下面這個(gè)例子,使用 open 函數(shù)打開(kāi) demo.txt
文件,可是在當(dāng)前目錄下并沒(méi)有這個(gè)文件,所以一定會(huì)打開(kāi)失敗,拋出了IOError。
>>> fp = open('demo.txt')
Traceback (most recent call last):
File "", line 1, in
IOError: [Errno 2] No such file or directory: 'demo.txt'
這些導(dǎo)致程序在運(yùn)行過(guò)程中出現(xiàn)異常中斷和退出的錯(cuò)誤,我們統(tǒng)稱(chēng)為異常。正常情況下,異常都不會(huì)被程序處理,而是以錯(cuò)誤信息的形式展現(xiàn)出來(lái)。
異常有很多種類(lèi)型,Python內(nèi)置了幾十種常見(jiàn)的異常,就在builtins模塊內(nèi),它們無(wú)需特別導(dǎo)入,就可以直接使用。需要注意的是,所有的異常都是異常類(lèi),首字母是大寫(xiě)的!
在發(fā)生異常的時(shí)候,Python會(huì)打印出異常信息,信息的前面部分顯示了異常發(fā)生的上下文環(huán)境,并以調(diào)用棧的形式顯示具體信息。異常類(lèi)型作為信息的一部分也會(huì)被打印出來(lái),例如ZeroDivisionError,TypeError。
>>> 1/0
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>> 10 + "1"
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'
正常情況下,我們都不需要去記住 Python 到底內(nèi)置了哪些錯(cuò)誤和異常類(lèi)型,除非你需要去捕獲它,關(guān)于捕獲的內(nèi)容,我會(huì)放在下一節(jié)。這一節(jié)先來(lái)認(rèn)識(shí)一下 Python 中有哪些常見(jiàn)的錯(cuò)誤和異常,對(duì)于新手,下面的內(nèi)容大概過(guò)一下就好,不用深究,因?yàn)檫@些在你以后的編碼中都會(huì)遇到的。
1.SyntaxError
SyntaxError,是語(yǔ)法錯(cuò)誤,可能是新手在學(xué)習(xí) Python 時(shí)最容易遇到的錯(cuò)誤
>>> while True print('Hello world')
File "", line 1
while True print('Hello world')
^
SyntaxError: invalid syntax
解析器會(huì)輸出出現(xiàn)語(yǔ)法錯(cuò)誤的那一行,并顯示一個(gè)“箭頭”,指向這行里面檢測(cè)到的第一個(gè)錯(cuò)誤。 錯(cuò)誤是由箭頭指示的位置 上面 的 token 引起的(或者至少是在這里被檢測(cè)出的):在示例中,在 print()
這個(gè)函數(shù)中檢測(cè)到了錯(cuò)誤,因?yàn)樵谒懊嫔倭藗€(gè)冒號(hào) (':'
) 。文件名和行號(hào)也會(huì)被輸出,以便輸入來(lái)自腳本文件時(shí)你能知道去哪檢查。
2、TypeError
TypeError,是類(lèi)型錯(cuò)誤,也就是說(shuō)將某個(gè)操作或功能應(yīng)用于不合適類(lèi)型的對(duì)象時(shí)引發(fā),比如整型與字符型進(jìn)行加減法
>>> a = 10
>>> b = "1"
>>>
>>> a-b
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for -: 'int' and 'str'
3、IndexError
IndexError,是指索引出現(xiàn)了錯(cuò)誤,比如最常見(jiàn)下標(biāo)索引超出了序列邊界
>>> alist = [0,1,2]
>>> alist[5]
Traceback (most recent call last):
File "", line 1, in
IndexError: list index out of range
4、KeyError
KeyError是關(guān)鍵字錯(cuò)誤,這個(gè)異常主要發(fā)生在字典中,比如當(dāng)用戶試圖訪問(wèn)一個(gè)字典中不存在的鍵時(shí)會(huì)被引發(fā)。
>>> profile = {"name": "王炳明"}
>>> profile["age"]
Traceback (most recent call last):
File "", line 1, in
KeyError: 'age'
5、ValueError
ValueError為值錯(cuò)誤,當(dāng)用戶傳入一個(gè)調(diào)用者不期望的值時(shí)會(huì)引發(fā),即使這個(gè)值的類(lèi)型是正確的,比如想獲取一個(gè)列表中某個(gè)不存在值的索引。
>>> int("1")
1
>>> int("a")
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: 'a'
6、AttributeError
AttributeError是屬性錯(cuò)誤,當(dāng)用戶試圖訪問(wèn)一個(gè)對(duì)象不存在的屬性時(shí)會(huì)引發(fā)。
比如字典有g(shù)et方法,而列表卻沒(méi)有,所以對(duì)一個(gè)列表對(duì)象調(diào)用該方法就會(huì)引發(fā)該異常。
>>> alist = [0,1,2]
>>> alist.get(0)
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'list' object has no attribute 'get'
7、NameError
NameError是指變量名稱(chēng)發(fā)生錯(cuò)誤,比如用戶試圖調(diào)用一個(gè)還未被賦值或初始化的變量時(shí)會(huì)被觸發(fā)。
>>> name
Traceback (most recent call last):
File "", line 1, in
NameError: name 'name' is not defined
8、IOError
IOError 為打開(kāi)文件錯(cuò)誤,當(dāng)用戶試圖以讀取方式打開(kāi)一個(gè)不存在的文件時(shí)引發(fā)。
>>> fb = open('demo.txt')
Traceback (most recent call last):
File "", line 1, in
IOError: [Errno 2] No such file or directory: 'demo.txt'
9、StopIteration
StopIteration為迭代器錯(cuò)誤,當(dāng)訪問(wèn)至迭代器最后一個(gè)值時(shí)仍然繼續(xù)訪問(wèn),就會(huì)引發(fā)這種異常,提醒用戶迭代器中已經(jīng)沒(méi)有值可供訪問(wèn)了。
>>> alist = range(2)
>>> agen = iter(alist)
>>> next(agen)
0
>>> next(agen)
1
>>> next(agen)
Traceback (most recent call last):
File "", line 1, in
StopIteration
10、AssertionError
AssertionError 為斷言錯(cuò)誤,當(dāng)用戶利用斷言語(yǔ)句檢測(cè)異常時(shí),如果斷言語(yǔ)句檢測(cè)的表達(dá)式為假,則會(huì)引發(fā)這種異常。
>>> alist = [0,1,2]
>>> assert isinstance(alist, list)
>>> assert isinstance(alist, dict)
Traceback (most recent call last):
File "", line 1, in
AssertionError
11. IndentationError
Python 是一門(mén)嚴(yán)格縮進(jìn)的語(yǔ)言,如果縮進(jìn)有問(wèn)題,就會(huì)導(dǎo)致解釋器解析異常,拋出 IndentationError
>>> while True:
... print("hello")
File "", line 2
print("hello")
^
IndentationError: expected an indented block
12. ImportError
當(dāng)你在使用 import 導(dǎo)包的時(shí)候,如果因?yàn)榘e(cuò)誤或者路徑不對(duì)、包未安裝,都會(huì)拋出 ImportError
>>> import oss
Traceback (most recent call last):
File "", line 1, in
ImportError: No module named oss
審核編輯:符乾江
-
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86478 -
異常
+關(guān)注
關(guān)注
0文章
23瀏覽量
9354
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論