詳解在Python中處理異常的教程
什么是異常?
異常是一個(gè)事件,其中一個(gè)程序,破壞程序的指令的正常流的執(zhí)行過(guò)程中而發(fā)生的。一般情況下,當(dāng)一個(gè)Python腳本遇到一些情況不能處理,就拋出一個(gè)異常。異常是一個(gè)Python對(duì)象,它表示一個(gè)錯(cuò)誤。
當(dāng)Python腳本拋出一個(gè)異常,它必須處理異常,否則將立即終止。
處理異常:
如果有可能會(huì)引發(fā)異常的一些可疑的代碼,就可以通過(guò)將可疑的代碼在一個(gè)try塊:保衛(wèi)你的程序。在try塊,包括以下情況except:語(yǔ)句,其次是代碼,作為優(yōu)雅的處理問(wèn)題,盡可能塊。
語(yǔ)法
這里是try....except...else 塊的簡(jiǎn)單語(yǔ)法:
try: You do your operations here; ...................... except ExceptionI: If there is ExceptionI, then execute this block. except ExceptionII: If there is ExceptionII, then execute this block. ...................... else: If there is no exception then execute this block.
這里有一些關(guān)于上述語(yǔ)法要點(diǎn):
- 單個(gè)try語(yǔ)句可以有多個(gè)不同的語(yǔ)句。當(dāng)try塊中包含可能會(huì)引發(fā)不同類型的異常語(yǔ)句,這是很有用的。
- 也可以提供一個(gè)通用的except子句,它用來(lái)處理任何異常。
- except子句后,可以包括其他子句。塊沒(méi)有引發(fā)異常:在別的塊中的代碼,如果在try中的代碼執(zhí)行。
- 在else塊是不需要try:塊的代碼的保護(hù)。
例子
這里是簡(jiǎn)單的例子,這將打開(kāi)一個(gè)文件并寫(xiě)入內(nèi)容的文件中并移出正常:
#!/usr/bin/python try: fh = open("testfile", "w") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can\'t find file or read data" else: print "Written content in the file successfully" fh.close()
這將產(chǎn)生以下結(jié)果:
Written content in the file successfully
示例:
這里有一個(gè)更簡(jiǎn)單的例子,它試圖打開(kāi)沒(méi)有權(quán)限并在文件中寫(xiě)入內(nèi)容,所以它會(huì)引發(fā)一個(gè)異常:
#!/usr/bin/python try: fh = open("testfile", "r") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can\'t find file or read data" else: print "Written content in the file successfully"
這將產(chǎn)生以下結(jié)果:
Error: can't find file or read data
在except子句無(wú)異常:
還可以使用不同的定義如下無(wú)異常的聲明:
try: You do your operations here; ...................... except: If there is any exception, then execute this block. ...................... else: If there is no exception then execute this block.
try-except 語(yǔ)句捕獲所有出現(xiàn)的異常。使用這種try-except 聲明不被認(rèn)為是一個(gè)良好的編程習(xí)慣,但因?yàn)樗东@所有異常,但不會(huì)使程序員找出可能出現(xiàn)的問(wèn)題的根本原因。
在except子句的多個(gè)異常:
也可以使用相同的除語(yǔ)句來(lái)處理多個(gè)異常,如下所示:
try: You do your operations here; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): If there is any exception from the given exception list, then execute this block. ...................... else: If there is no exception then execute this block.
try-finally 語(yǔ)句:
可以使用finally:塊連同try:塊。在try塊是否引發(fā)異?;驔](méi)有任何代碼 finally塊是一個(gè)必須執(zhí)行的塊。try-finally語(yǔ)句的語(yǔ)法是這樣的:
try: You do your operations here; ...................... Due to any exception, this may be skipped. finally: This would always be executed. ......................
請(qǐng)注意,可以提供except子句或finally子句,但不能同時(shí)使用。不能同時(shí)使用else子句與finally子句。
例子:
#!/usr/bin/python try: fh = open("testfile", "w") fh.write("This is my test file for exception handling!!") finally: print "Error: can\'t find file or read data"
如果沒(méi)有權(quán)限,以寫(xiě)入方式打開(kāi)文件,那么這將產(chǎn)生以下結(jié)果:
Error: can't find file or read data
同樣的例子可以寫(xiě)入更簡(jiǎn)潔,如下所示:
#!/usr/bin/python try: fh = open("testfile", "w") try: fh.write("This is my test file for exception handling!!") finally: print "Going to close the file" fh.close() except IOError: print "Error: can\'t find file or read data"
當(dāng)一個(gè)異常被拋出在try塊中,執(zhí)行立即傳遞到finally塊。finally塊中的所有語(yǔ)句都執(zhí)行,該異常被再次拋出,并在被處理 except 語(yǔ)句如果出現(xiàn)在一個(gè)更高的層在try-except語(yǔ)句。
Exception參數(shù):
異??梢杂幸粋€(gè)參數(shù),參數(shù)是一個(gè)值,它給出了關(guān)于這個(gè)問(wèn)題的其他信息。參數(shù)按異常內(nèi)容改變。可以通過(guò)不同的子句提供一個(gè)變量,如下所示捕獲異常的參數(shù):
try: You do your operations here; ...................... except ExceptionType, Argument: You can print value of Argument here...
如果正在編寫(xiě)代碼來(lái)處理一個(gè)異常,可以有一個(gè)變量按照異常的名稱在不同的聲明。如果捕捉多個(gè)異常,可以有一個(gè)變量按照異常的元組。
這個(gè)變量將接收主要包含異常原因的異常值。該變量可以在一個(gè)元組的形式接收一個(gè)或多個(gè)值。該元組通常包含錯(cuò)誤串,錯(cuò)誤碼和一個(gè)錯(cuò)誤的位置。
示例:
下面是一個(gè)異常的例子:
#!/usr/bin/python # Define a function here. def temp_convert(var): try: return int(var) except ValueError, Argument: print "The argument does not contain numbers\n", Argument # Call above function here. temp_convert("xyz");
這將產(chǎn)生以下結(jié)果:
The argument does not contain numbers invalid literal for int() with base 10: 'xyz'
拋出異常:
可以通過(guò)使用raise語(yǔ)句拋出幾個(gè)方面的異常。一般raise語(yǔ)句的語(yǔ)法。
語(yǔ)法
raise [Exception [, args [, traceback]]]
這里,Exception是異常的類型(例如,NameError)和參數(shù)是用于異常的參數(shù)值。該參數(shù)是可選的;如果未提供,則異常的參數(shù)是None。
最后一個(gè)參數(shù)traceback,也是可選的(并且在實(shí)踐中很少使用),并且如果存在的話,那么用于異常回溯對(duì)象。
例子:
異常可以是一個(gè)字符串,一個(gè)類或一個(gè)對(duì)象。大多數(shù)Python核心拋出是類,有參數(shù)認(rèn)為是類的實(shí)例的異常。定義新的異常是很容易的,可以參考如下:
def functionName( level ): if level < 1: raise "Invalid level!", level # The code below to this would not be executed # if we raise the exception
注:為了捕獲一個(gè)異常,“except”語(yǔ)句必須引用拋出類對(duì)象或簡(jiǎn)單的字符串相同的異常。例如,捕捉到上面的異常,必須寫(xiě)except子句,如下所示:
try: Business Logic here... except "Invalid level!": Exception handling here... else: Rest of the code here...
用戶定義的異常:
Python中,還可以通過(guò)內(nèi)置的異常標(biāo)準(zhǔn)的派生類來(lái)創(chuàng)建自己的異常。
下面是有關(guān)RuntimeError一個(gè)例子。這里是從RuntimeError子類的類被創(chuàng)建。當(dāng)需要顯示更多的具體信息時(shí),一個(gè)異常被捕獲,這是很有用的。
在try塊中,用戶定義的異常引發(fā),并夾在except塊。變量e被用來(lái)創(chuàng)建類Networkerror的一個(gè)實(shí)例。
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
所以一旦在上面定義的類,可以按如下方法拋出異常:
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
相關(guān)文章
Django框架文件上傳與自定義圖片上傳路徑、上傳文件名操作分析
這篇文章主要介紹了Django框架文件上傳與自定義圖片上傳路徑、上傳文件名操作,結(jié)合實(shí)例形式分析了Django框架文件上傳的原理、步驟、實(shí)現(xiàn)方法以及圖片上傳時(shí)自定義上傳路徑、上傳文件名的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05python3 實(shí)現(xiàn)爬取TOP500的音樂(lè)信息并存儲(chǔ)到mongoDB數(shù)據(jù)庫(kù)中
今天小編就為大家分享一篇python3 實(shí)現(xiàn)爬取TOP500的音樂(lè)信息并存儲(chǔ)到mongoDB數(shù)據(jù)庫(kù)中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08TensorFlow中關(guān)于tf.app.flags命令行參數(shù)解析模塊
這篇文章主要介紹了TensorFlow中關(guān)于tf.app.flags命令行參數(shù)解析模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11詳解K-means算法在Python中的實(shí)現(xiàn)
這篇文章主要介紹了詳解K-means算法在Python中的實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12Python中用startswith()函數(shù)判斷字符串開(kāi)頭的教程
這篇文章主要介紹了Python中用startswith()函數(shù)判斷字符串開(kāi)頭的教程,startswith()函數(shù)的使用是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),本文列舉了一些不同情況下的使用結(jié)果,需要的朋友可以參考下2015-04-04Pytorch中transforms.Resize()的簡(jiǎn)單使用
這篇文章主要介紹了Pytorch中transforms.Resize()的簡(jiǎn)單使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python 調(diào)試?yán)渲R(shí)(小結(jié))
這篇文章主要介紹了python 調(diào)試?yán)渲R(shí)(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python unittest基本使用方法代碼實(shí)例
這篇文章主要介紹了Python unittest基本使用方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06