python編程進(jìn)階之異常處理用法實(shí)例分析
本文實(shí)例講述了python異常處理用法。分享給大家供大家參考,具體如下:
之前用Java的時(shí)候,在容易出錯(cuò)的地方我們經(jīng)常使用try…catch或者try…catch…finally來(lái)捕捉和顯示異常,在python中很高興地發(fā)現(xiàn)它也有這樣的機(jī)制。
try..except
這個(gè)用于當(dāng)異常出現(xiàn)的時(shí)候,用except從句來(lái)處理異常,而不至于程序自動(dòng)退出。例如,在python里獲取用戶輸入時(shí),若用戶輸入文件結(jié)束符Ctrl-d,則會(huì)引發(fā)EOFError文件結(jié)束異常。我們使用try except來(lái)處理:
#!/usr/bin/python
# Filename: try_except.py
import sys
try:
s = raw_input('Enter something --> ')
except EOFError:
print '\nWhy did you do an EOF on me?'
sys.exit() # exit the program
except:
print '\nSome error/exception occurred.'
# here, we are not exiting the program
print 'Done'
我們?cè)谶\(yùn)行程序的時(shí)候輸入Ctrl-d:
$ python try_except.py
Enter something -->
Why did you do an EOF on me?$ python try_except.py
Enter something --> Python is exceptional!
Done
可以看到,當(dāng)遇到EOFERROR時(shí),程序執(zhí)行了except EOFError:中的內(nèi)容。若出現(xiàn)其他異常,則會(huì)執(zhí)行except:從句中的內(nèi)容。except后面還可以加else從句,如果沒(méi)有發(fā)生異常,則執(zhí)行else從句中的內(nèi)容。記住,首先,我們要導(dǎo)入sys模塊!!
try.. catch
catch主要用于異常出現(xiàn)的時(shí)候抓取異常,方便顯示異常信息。但是我還沒(méi)有見(jiàn)別人用過(guò),找不到例子~所以是不推薦用嘛?誰(shuí)找到例子可以留言給我^.^
try.. finally
假如你在讀一個(gè)文件的時(shí)候,希望在無(wú)論異常發(fā)生與否的情況下都關(guān)閉文件,該怎么做呢?這可以使用finally塊來(lái)完成。注意,在一個(gè)try塊下,你可以同時(shí)使用except從句和finally塊。如果你要同時(shí)使用它們的話,需要把一個(gè)嵌入另外一個(gè)。舉個(gè)例子(還記得文件讀寫里的poem嘛):
#!/usr/bin/python
# Filename: finally.py
import time
try:
f = file('poem.txt')
while True: # our usual file-reading idiom
line = f.readline()
if len(line) == 0:
break
time.sleep(2)
print line,
finally:
f.close()
print 'Cleaning up...closed the file'
輸出:
$ python finally.py
Programming is fun
When the work is done
Cleaning up...closed the file
Traceback (most recent call last):
File "finally.py", line 12, in ?
time.sleep(2)
KeyboardInterrupt
我們進(jìn)行通常的讀文件工作,但是我有意在每打印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程序運(yùn)行得慢一些(Python由于其本質(zhì)通常運(yùn)行得很快)。在程序運(yùn)行的時(shí)候,按Ctrl-c中斷/取消程序。
我們可以觀察到KeyboardInterrupt異常被觸發(fā),程序退出。但是在程序退出之前,finally從句仍然被執(zhí)行,把文件關(guān)閉
用raise引發(fā)異常
我們可以使用raise語(yǔ)句 引發(fā) 異常,但要指明錯(cuò)誤/異常的名稱和伴隨異常 觸發(fā)的 異常對(duì)象。你可以引發(fā)的錯(cuò)誤或異常應(yīng)該分別是一個(gè)Error或Exception類的直接或間接子類。舉個(gè)例子:
#!/usr/bin/python
# Filename: raising.py
class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__(self, length, atleast):
Exception.__init__(self)
self.length = length
self.atleast = atleast
try:
s = raw_input('Enter something --> ')
if len(s) < 3:
raise ShortInputException(len(s), 3)
# Other work can continue as usual here
except EOFError:
print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
print 'ShortInputException: The input was of length %d, \
was expecting at least %d' % (x.length, x.atleast)
else:
print 'No exception was raised.'
輸出:
$ python raising.py
Enter something -->
Why did you do an EOF on me?$ python raising.py
Enter something --> ab
ShortInputException: The input was of length 2, was expecting at least 3$ python raising.py
Enter something --> abc
No exception was raised.
這里,我們創(chuàng)建了我們自己的異常類型,其實(shí)我們可以使用任何預(yù)定義的異常/錯(cuò)誤。自己定義的異常類型是ShortInputException類。它有兩個(gè)域——length是給定輸入的長(zhǎng)度,atleast則是程序期望的最小長(zhǎng)度。
在except從句中,我們提供了錯(cuò)誤類和用來(lái)表示錯(cuò)誤/異常對(duì)象的變量。這與函數(shù)調(diào)用中的形參和實(shí)參概念類似。當(dāng)觸發(fā)raise從句時(shí),會(huì)調(diào)用對(duì)應(yīng)的except從句執(zhí)行,在這個(gè)例子中就引發(fā)了except ShortInputException,x 這個(gè)錯(cuò)誤,類似于調(diào)用。
更多Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python入門與進(jìn)階經(jīng)典教程》、《Python字符串操作技巧匯總》、《Python列表(list)操作技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python打包exe時(shí)各種異常處理方案總結(jié)
- python基礎(chǔ)之文件操作和異常處理
- Python Selenium異常處理的實(shí)例分析
- Python pip install之SSL異常處理操作
- Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析
- python異常處理之try finally不報(bào)錯(cuò)的原因
- python except異常處理之后不退出,解決異常繼續(xù)執(zhí)行的實(shí)現(xiàn)
- python異常處理、自定義異常、斷言原理與用法分析
- Python random庫(kù)使用方法及異常處理方案
- Python異常處理中容易犯得錯(cuò)誤總結(jié)
相關(guān)文章
解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認(rèn)驅(qū)動(dòng)程序的問(wèn)題
今天小編就為大家分享一篇解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認(rèn)驅(qū)動(dòng)程序的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
matlab 計(jì)算灰度圖像的一階矩,二階矩,三階矩實(shí)例
這篇文章主要介紹了matlab 計(jì)算灰度圖像的一階矩,二階矩,三階矩實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
簡(jiǎn)單有效上手Python3異步asyncio問(wèn)題
這篇文章主要介紹了簡(jiǎn)單有效上手Python3異步asyncio問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Pandas —— resample()重采樣和asfreq()頻度轉(zhuǎn)換方式
今天小編就為大家分享一篇Pandas —— resample()重采樣和asfreq()頻度轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python?包(模塊?函數(shù)?類?定義?導(dǎo)入)使用詳解
這篇文章主要為大家介紹了python?包(模塊?函數(shù)?類?定義?導(dǎo)入)的使用詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
淺談在django中使用filter()(即對(duì)QuerySet操作)時(shí)踩的坑
這篇文章主要介紹了淺談在django中使用filter()(即對(duì)QuerySet操作)時(shí)踩的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
詳解django實(shí)現(xiàn)自定義manage命令的擴(kuò)展
這篇文章主要介紹了django實(shí)現(xiàn)自定義manage命令的擴(kuò)展,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

