本篇內(nèi)容主要講解“分析Python異常處理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“分析Python異常處理”吧!
為太仆寺等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及太仆寺網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、太仆寺網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
“你不可能總是對的”
甚至計算機(jī)也會有失誤的時候。當(dāng)然程序員也不例外,就算是經(jīng)驗豐富的碼農(nóng),也不能保證寫出來的代碼百分之百沒有任何問題(要不哪來的那么多的漏洞)。
程序出現(xiàn)邏輯錯誤或者用戶輸入不合法都會引發(fā)異常,但這些一場不是致命的,不會導(dǎo)致程序壞死??梢岳肞ython提供的異常處理機(jī)制,在異常出現(xiàn)的時候及時捕獲,并從內(nèi)部消化掉。
那么接下來就是正確學(xué)習(xí)Python的姿勢了。
那什么是異常呢?我們先來了解下,如果你編寫了一個異常代碼,運行后,會出現(xiàn)異常,代碼會停止,并顯示出一個 Traceback ,這其中就包含了有關(guān)異常的報告,舉個例子:
#example1.py
file_name = '不存在的文件.txt'
f = open(file_name, 'r')
print('輸出文件內(nèi)容:')
for line in f:
print(line)
這里是打開一個不存在的文件,那么這就會使代碼出現(xiàn)異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example1.py", line 2, in
f = open(file_name, 'r')
FileNotFoundError: [Errno 2] No such file or directory: '隨便來個文件.txt'
上面的例子就拋出了一個FileNotFoundError異常。
當(dāng)然了Python不可能只拋出這么一個異常,
那Python通常會拋出那些異常呢?這里我先一一列舉出來,做個總結(jié),讓大家先有個認(rèn)識,這樣今后遇見這樣的異常時就不會感到陌生了。
常見異常總結(jié)
1. FileNotFoundError:找不到文件異常
使用文件時,一種常見的問題是找不到文件:你要查找的文件可能在其他什么地方,文件名可能不正確或者這個文件根本不存在。
上面已舉例,這里我就不再舉例了。
2. AssertionError:斷言語句(assert)失敗
當(dāng) assert 這個我關(guān)鍵字后面的條件為假時,程序?qū)⑼V共伋?AssertionError 異常。assert 語句一般是在測試程序的時候用于在代碼中置入檢查點:
#example2
my_list = ['example2']
assert len(my_list) > 0
my_list.pop()
assert len(my_list) > 0
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 5, in
assert len(my_list) > 0
AssertionError
3. AttributeError:嘗試訪問未知的對象屬性
當(dāng)試圖訪問的對象屬性不存在時拋出 AttributeError 異常:
#example3
my_list = []
my_list.example3
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 2, in
my_list.example3
AttributeError: 'list' object has no attribute 'example3'
4. IndexError:索引超出序列范圍
在使用序列的時候就常常會遇到 IndexError 異常,原因是索引超出序列范圍的內(nèi)容:
#example4
my_list = [1,2,3]
x = my_list[3]
print(x)
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 2, in
x = my_list[3]
IndexError: list index out of range
5. KeyError:字典中查找一個不存在的關(guān)鍵字
當(dāng)試圖在字典中查找一個不存在的關(guān)鍵字時就會引發(fā) KeyError 異常,因此建議使用 dict.get()方法:
# example5
my_dist = {'one':1, 'two':2, 'three':3}
x = my_dist['one']
print(x)
y = my_dist['four']
print(y)
異常:
1
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 4, in
y = my_dist['four']
KeyError: 'four'
6. NameError:嘗試訪問一個不存在的變量
當(dāng)嘗試訪問一個不存在的變量時,Python會拋出 NameError 異常:
#example6
example6
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
example6
NameError: name 'example6' is not defined
7. OSError:操作系統(tǒng)產(chǎn)生的異常
OSError ,顧名思義就是操作系統(tǒng)產(chǎn)生的異常,就像打開一個不存在的文件就會引發(fā) FileNotFindError ,而這個 FileNotFindError 就是 OSError 的子類。
例子在上面已演示過了,這里就不再重說了。
8. SyntaxError:Python 的語法錯誤
如果遇到 SyntaxError 是 Python 的語法錯誤,這時 Python 的代碼并不能繼續(xù)執(zhí)行,應(yīng)該先找到并改正錯誤:
#example8
print 'I am example8'
異常:
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1
print 'I am example8'
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('I am example8')?
9. TypeError:不同類型間的無效操作
類型不同的對象是不能互相進(jìn)行計算的,否則會拋出 TypeError 異常:
#example9
x = 1 + '1'
print(x)
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
x = 1 + '1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
10. ZeroDivisionError:除數(shù)為零
地球人都知道除數(shù)不為零,所以除以零就會引發(fā) ZeroDivisionError 異常:
#example10
x = 365 / 0
print(x)
異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
x = 365 / 0
ZeroDivisionError: division by zero
現(xiàn)在我們已經(jīng)講完常見的異常類型了,那接下來就是進(jìn)入正題,該如何處理異常了
一、 try—except 語句
1. 語法結(jié)構(gòu):
try:
檢測內(nèi)容
except Exception [as reason]:
出現(xiàn)異常(Exception)后的處理代碼
2. 簡單舉個例子:
#example
f = open('不存在的文檔.txt')
print(f.read())
f.close()
當(dāng)上面的例子中’不存在的文檔.txt‘,這個文檔不存在時,Python就會報錯出現(xiàn)異常:
Traceback (most recent call last):
File "E:/PycharmProjects/untitled2/abnormal/example.py", line 1, in
f = open('不存在的文檔.txt')
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文檔.txt'
這時為了解決異常問題,我們可以這么修改代碼:
try:
f = open('不存在的文檔.txt')
print(f.read())
f.close()
except OSError:
print('文件打開的時候出錯啦T_T')
運行一下試試:
文件打開的時候出錯啦T_T
注:這里我之所以用 OSError 而沒用 FileNotFindError 是因為導(dǎo)致 OSError 異常的原因有很多(如 FileNotFindError,F(xiàn)ileExistsError,PermissionError 等)
當(dāng)然了,如果你更在意出錯的具體內(nèi)容,這里可以用 as 把具體的錯誤信息給打印出來:
try:
f = open('不存在的文檔.txt')
print(f.read())
f.close()
except OSError as reason:
print('文件打開的時候出錯啦T_T\n 錯誤原因是:' + str(reason))
運行后,結(jié)果為:
文件打開的時候出錯啦T_T
錯誤原因是:[Errno 2] No such file or directory: '不存在的文檔.txt'
3. 針對不同異常設(shè)置多個 except
一個 try 語句可以和多個 except 語句搭配(缺點是它只會返回第一個發(fā)現(xiàn)的異常):
#example
try:
x = 1 + '1'
f = open('不存在的文檔.txt')
print(f.read())
f.close()
except OSError as reason:
print('文件打開的時候出錯啦T_T\n 錯誤原因是:' + str(reason))
except TypeError as reason:
print('類型出錯啦T_T\n 錯誤原因是:' + str(reason))
運行后,結(jié)果為:
類型出錯啦T_T
錯誤原因是:unsupported operand type(s) for +: 'int' and 'str'
4. 對多個異常統(tǒng)一處理
except 后面還可以跟著多個異常,然后對這些異常進(jìn)行統(tǒng)一的處理(同樣缺點是它只會返回第一個發(fā)現(xiàn)的異常):
try:
int('abc')
x = 1 + '1'
f = open('不存在的文檔.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as reason:
print('出錯啦T_T\n 錯誤原因是:' + str(reason))
運行后,結(jié)果為:
出錯啦T_T鄭州哪個醫(yī)院做人流好 http://www.hnmt120.com/
錯誤原因是:invalid literal for int() with base 10: 'abc'
5. 捕獲所有異常
如果你無法判斷要對哪一類型的異常進(jìn)行處理,只是希望在 try 語句中一旦出現(xiàn)異常,可以返回一個看得懂的異常錯誤提醒,那么可以這么做:
try:
int('abc')
x = 1 + '1'
f = open('不存在的文檔.txt')
print(f.read())
f.close()
except:
print('出錯啦T_T')
運行后,結(jié)果為:
出錯啦T_T
注: 不過通常不建議這么做,因為它會隱藏所有程序未想到并且未做好處理準(zhǔn)備的錯誤。
二、 try—finally 語句
如果確定存在一個名為 ’不存在的文檔.txt‘ 的文件,open() 函數(shù)正常返回文件對象,但異常卻發(fā)生在成功打開文件后的 x = 1 + ’1‘ 語句上。此時 Python 將直接跳到 except 語句上,也就是說,文件打開了,但關(guān)閉文件的命令卻被跳過了,導(dǎo)致沒有關(guān)閉文件。
try:
f = open('不存在的文檔.txt')
print(f.read())
x = 1 + '1'
f.close()
except:
print('出錯啦T_T')
因此出現(xiàn)了,為了實現(xiàn)像這種”就算出現(xiàn)異常,但也并不的不執(zhí)行的收尾工作(如在程序崩潰前保存用戶文檔)“,引入了 finally 來擴(kuò)展 try:
try:
f = open('不存在的文檔.txt')
print(f.read())
x = 1 + '1'
except:
print('出錯啦T_T')
finally:
f.close()
注:如果 try 語句塊中沒有出現(xiàn)任何異常,會跳過 except 語句塊執(zhí)行 finally 語句塊的內(nèi)容。如果出現(xiàn)了異常,則會先執(zhí)行 except 語句塊的內(nèi)容再執(zhí)行 finally 語句塊的內(nèi)容??傊?,finally 語句塊中的內(nèi)容就是確保無論如何都將被執(zhí)行的內(nèi)容。
三、 try—except 擴(kuò)展 (出現(xiàn)異常時一聲不吭)
如果我們想在出現(xiàn)異常時,當(dāng)作什么也沒發(fā)生,不做任何處理,可以使用 pass 語句來實現(xiàn)。
try:
f = open('不存在的文檔.txt')
print(f.read())
except:
pass
運行后,結(jié)果為:
Process finished with exit code 0
四、 else 語句搭配
else 語句還能與異常處理進(jìn)行搭配,實現(xiàn)方法與循環(huán)語句搭配差不多:只要 try 語句塊里沒有出現(xiàn)任何異常,那么就會執(zhí)行 else 語句塊里的內(nèi)容。
try:
int(4.5)
except ValueError as reason:
print('出錯啦T_T: '+ str(reason))
else:
print('沒有任何異常!')
運行后,結(jié)果為:
沒有任何異常!
Process finished with exit code 0
五、 簡潔的 with 語句
你們在玩文件的時候可能都見過 with 語句 ,但是你們都理解為什么要帶著它嗎?
你們可能覺得,既要打開文件又要關(guān)閉文件,還要關(guān)注異常處理,有點麻煩,所以 Python 提供了一個 with 語句,利用這個語句抽象出文件操作中頻繁使用的 try/except/finally 相關(guān)的細(xì)節(jié)。對文件操作使用 with 語句,將大大減少代碼量,而且再也不用擔(dān)心出現(xiàn)文件打開了忘記關(guān)閉的問題了 ( with 會自動幫助關(guān)閉文件)。
舉例:
try:
f = open('不存在的文檔.txt', 'w')
print(f.read())
except OSError as reason:
print('出錯啦T_T: ' + str(reason))
finally:
f.close()
使用 with 語句 ,可以改成以下這樣:
try:
with open('不存在的文檔.txt', 'w') as f:
print(f.read())
except OSError as reason:
print('出錯啦T_T: ' + str(reason))
是不是覺得很方便呢,有了 with 語句,就在也不用擔(dān)心忘記關(guān)閉文件了。
到此,相信大家對“分析Python異常處理”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!