在本文中,您將了解如何使用try、except和finally語(yǔ)句在Python程序中處理異常。這將激勵(lì)您用Python編寫(xiě)干凈、可讀和高效的代碼。
Python有許多內(nèi)置的異常 ,當(dāng)其中的某些錯(cuò)誤出現(xiàn)時(shí),它們會(huì)強(qiáng)制您的程序輸出錯(cuò)誤。
當(dāng)發(fā)生這些異常時(shí),它將導(dǎo)致當(dāng)前進(jìn)程停止并將其傳遞給調(diào)用進(jìn)程,直到被處理為止。如果不處理,我們的程序?qū)⒈罎ⅰ?/p>
例如,如果函數(shù)A調(diào)用函數(shù)B,后者又調(diào)用函數(shù)C,并且在函數(shù)C中發(fā)生異常。如果不在C中處理該異常,則該異常將傳遞給B,然后傳遞給A。
如果不進(jìn)行處理,就會(huì)拋出一條錯(cuò)誤消息,我們的程序就會(huì)意外地突然停止。
在Python中,可以使用try語(yǔ)句處理異常。
可能引發(fā)異常的關(guān)鍵操作放在try子句中,并且將處理異常的代碼編寫(xiě)在except子句中。
捕獲異常后,我們將執(zhí)行什么操作取決于我們自己。這是一個(gè)簡(jiǎn)單的示例。
# 導(dǎo)入模塊sys以獲取異常的類型 import sys randomList = ['a', 0, 2] for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!",sys.exc_info()[0],"occured.") print("Next entry.") print() print("The reciprocal of",entry,"is",r)
輸出結(jié)果
The entry is a Oops! <class 'ValueError'> occured. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError' > occured. Next entry. The entry is 2 The reciprocal of 2 is 0.5
在此程序中,我們循環(huán)執(zhí)行,直到用戶輸入具有有效倒數(shù)的整數(shù)??赡軐?dǎo)致異常的部分放在try塊中。
如果沒(méi)有異常發(fā)生,則跳過(guò)除塊以外的內(nèi)容,并繼續(xù)正常流程。但是,如果發(fā)生任何異常,它將被except塊捕獲。
在這里,我們使用sys模塊中的exinfo()函數(shù)打印異常的名稱,并要求用戶再試一次。我們可以看到值‘a(chǎn)’和‘1.3’會(huì)導(dǎo)致ValueError,‘0’會(huì)導(dǎo)致ZeroDivisionError。
在上面的示例中,我們沒(méi)有在except子句中提到任何異常。
這不是一個(gè)好的編程習(xí)慣,因?yàn)樗鼘⒉东@所有異常并以相同的方式處理每種情況。 我們可以指定except子句會(huì)捕獲哪些異常。
一個(gè)try子句可以有任意數(shù)量的except子句來(lái)以不同的方式處理它們,但是在發(fā)生異常時(shí)只會(huì)執(zhí)行一個(gè)except子句。
我們可以使用值的元組在except子句中指定多個(gè)異常。下面是一個(gè)偽代碼示例。
try: #執(zhí)行某些代碼 pass except ValueError: # 處理ValueError異常 pass except (TypeError, ZeroDivisionError): # 處理多個(gè)異常 # TypeError 和 ZeroDivisionError 異常 pass except: # 處理所有其他異常 pass
在Python編程中,異常是在運(yùn)行時(shí)出現(xiàn)相應(yīng)錯(cuò)誤時(shí)拋出的,但是我們可以使用關(guān)鍵字raise強(qiáng)制拋出異常。
我們還可以選擇將值傳遞給異常,以闡明為什么會(huì)引發(fā)異常。
>>> raise KeyboardInterrupt Traceback (most recent call last): ... KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last): ... MemoryError: This is an argument >>> try: ... a = int(input("輸入一個(gè)正整數(shù): ")) ... if a <= 0: ... raise ValueError("這不是一個(gè)正數(shù)!") ... except ValueError as ve: ... print(ve) ... 輸入一個(gè)正整數(shù): -2 這不是一個(gè)正數(shù)!
Python中的try語(yǔ)句可以有一個(gè)可選的finally子句。不管在什么情況下都會(huì)執(zhí)行這個(gè)子句,它通常用于釋放外部資源。
例如,我們可以通過(guò)網(wǎng)絡(luò)連接到遠(yuǎn)程數(shù)據(jù)中心,或者使用文件或使用圖形用戶界面(GUI)。
在所有這些情況下,無(wú)論資源是否成功,我們都必須清除該資源。這些操作(關(guān)閉文件,GUI或與網(wǎng)絡(luò)斷開(kāi)連接)在finally子句中執(zhí)行,以確保執(zhí)行。
這是一個(gè)文件操作的示例來(lái)說(shuō)明這一點(diǎn)。
try: f = open("test.txt",encoding = 'utf-8') # 執(zhí)行文件操作 finally: f.close()
這種類型的構(gòu)造確保即使發(fā)生異常也關(guān)閉文件。