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模塊?。?/strong>
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數(shù)據(jù)處理——對(duì)pandas進(jìn)行數(shù)據(jù)變頻或插值實(shí)例
這篇文章主要介紹了python數(shù)據(jù)處理——對(duì)pandas進(jìn)行數(shù)據(jù)變頻或插值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python 異常的捕獲、異常的傳遞與主動(dòng)拋出異常操作示例
這篇文章主要介紹了Python 異常的捕獲、異常的傳遞與主動(dòng)拋出異常操作,結(jié)合實(shí)例形式詳細(xì)分析了Python針對(duì)異常捕獲、傳遞、處理等常見(jiàn)操作技巧,需要的朋友可以參考下2019-09-09Python+Pytorch實(shí)戰(zhàn)之彩色圖片識(shí)別
這篇文章主要為大家詳細(xì)介紹了如何利用Python+Pytorch實(shí)現(xiàn)彩色圖片識(shí)別功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-09-09Python通過(guò)paramiko庫(kù)實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法
這篇文章主要介紹了Python通過(guò)paramiko庫(kù)實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Python使用pandasai實(shí)現(xiàn)數(shù)據(jù)分析
本文主要介紹了Python使用pandasai實(shí)現(xiàn)數(shù)據(jù)分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06使用pandas把某一列的字符值轉(zhuǎn)換為數(shù)字的實(shí)例
今天小編就為大家分享一篇使用pandas把某一列的字符值轉(zhuǎn)換為數(shù)字的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01