詳解python中的異常捕獲
異常
異常是程序發(fā)生錯(cuò)誤的信號(hào),程序一旦出錯(cuò)就會(huì)拋出異常,程序的運(yùn)行隨之終止。
# 異常處理的三個(gè)特征 - 異常的追蹤信息 - 異常的類型 - 異常的內(nèi)容
捕獲異常的目的:為了增強(qiáng)程序的健壯性,即便程序運(yùn)行過程中出錯(cuò),也不要終止程序,而是捕獲異常并處理,將出錯(cuò)信息記錄到日志內(nèi)。
# 語法上錯(cuò)誤SyntaxError - 處理方式1:必須在程序運(yùn)行前就改正 # 邏輯上的錯(cuò)誤 - 錯(cuò)誤發(fā)生的條件是可以預(yù)知的 --> if判斷 - 錯(cuò)誤發(fā)生的條件是無法預(yù)知的 --> 異常捕獲 try
本來程序一旦出現(xiàn)異常就整體結(jié)束掉了,有了異常處理以后,在被檢測(cè)的代碼塊出現(xiàn)異常時(shí),被檢測(cè)的代碼塊中異常發(fā)生位置之后的代碼將不會(huì)執(zhí)行,取而代之的是執(zhí)行匹配異常的except子代碼塊,其余代碼均正常運(yùn)行。
異常捕獲
當(dāng)被檢測(cè)的代碼塊中有可能觸發(fā)不同類型的異常時(shí),針對(duì)不同類型的異常:
如果我們想分別用不同的邏輯處理,需要用到多分支的except(類似于多分支的elif,從上到下依次匹配,匹配成功一次便不再匹配其他)
try: # 有可能會(huì)拋出異常的代碼 子代碼1 子代碼2 子代碼3 except 異常類型1 as e: # as語法將異常類型的值賦值給變量e,這樣我們通過打印e便可以知道錯(cuò)誤的原因 pass except 異常類型2 as e: pass ... else: 如果被檢測(cè)的子代碼塊沒有異常發(fā)生,則會(huì)執(zhí)行else的子代碼 finally: 無論被檢測(cè)的子代碼塊有無異常發(fā)生,都會(huì)執(zhí)行finally的子代碼 # try不能和else單獨(dú)連用 # try 和 finally 連用,就算出了異常也先執(zhí)行finally下代碼塊再拋出異常
如果我們想多種類型的異常統(tǒng)一用一種邏輯處理,可以將多個(gè)異常放到一個(gè)元組內(nèi),用一個(gè)except匹配。
try: 被檢測(cè)的代碼塊 except (NameError,IndexError,TypeError): 觸發(fā)NameError或IndexError或TypeError時(shí)對(duì)應(yīng)的處理邏輯
如果我們想捕獲所有異常并用一種邏輯處理,Python提供了一個(gè)萬能異常類型 Exception
try: 被檢測(cè)的代碼塊 except NameError: 觸發(fā)NameError時(shí)對(duì)應(yīng)的處理邏輯 except IndexError: 觸發(fā)IndexError時(shí)對(duì)應(yīng)的處理邏輯 except Exception: 其他類型的異常統(tǒng)一用此處的邏輯處理
在不符合Python解釋器的語法或邏輯規(guī)則時(shí),是由Python解釋器主動(dòng)觸發(fā)的各種類型的異常,而對(duì)于違反程序員自定制的各類規(guī)則,則需要由程序員自己來明確地觸發(fā)異常,這就用到了raise語句,raise后必須是一個(gè)異常的類或者是異常的實(shí)例
class Student: def __init__(self,name,age): if not isinstance(name,str): raise TypeError('name must be str') if not isinstance(age,int): raise TypeError('age must be int') self.name=name self.age=age stu1=Student(4573,18) # TypeError: name must be str stu2=Student('egon','18') # TypeError: age must be int
在內(nèi)置異常不夠用的情況下,我們可以通過繼承內(nèi)置的異常類來自定義異常類
class PoolEmptyError(Exception): # 可以通過繼承Exception來定義一個(gè)全新的異常 def __init__(self,value='The proxy source is exhausted'): # 可以定制初始化方法 super(PoolEmptyError,self).__init__() self.value=value def __str__(self): # 可以定義該方法用來定制觸發(fā)異常時(shí)打印異常值的格式 return '< %s >' %self.value class NetworkIOError(IOError): # 也可以在特定異常的基礎(chǔ)上擴(kuò)展一個(gè)相關(guān)的異常 pass raise PoolEmptyError # __main__.PoolEmptyError: < The proxy source is exhausted > raise NetworkIOError('連接被拒絕') # __main__.NetworkIOError: 連接被拒絕
最后,Python還提供了一個(gè)斷言語句assert expression,斷定表達(dá)式expression成立,否則觸發(fā)異常AssertionError,與raise-if-not的語義相同,如下
age='18' # 若表達(dá)式isinstance(age,int)返回值為False則觸發(fā)異常AssertionError assert isinstance(age,int) # 等同于 if not isinstance(age,int): raise AssertionError
在了解了異常處理機(jī)制后,本著提高程序容錯(cuò)性和可靠性的目的,讀者可能會(huì)錯(cuò)誤地認(rèn)為應(yīng)該盡可能多地為程序加上try...except...,這其是在過度消費(fèi)程序的可讀性,因?yàn)閠ry...except本來就是你附加給程序的一種額外的邏輯,與你的主要工作是沒有多大關(guān)系的。所以不要隨便使用異常捕獲,只用當(dāng)當(dāng)異常發(fā)生時(shí)不可預(yù)知時(shí),或萬不得已時(shí)才使用異常捕獲。
以上就是詳解python中的異常捕獲的詳細(xì)內(nèi)容,更多關(guān)于python 異常捕獲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用python-cv2實(shí)現(xiàn)視頻的分解與合成的示例代碼
這篇文章主要介紹了使用python-cv2實(shí)現(xiàn)視頻的分解與合成的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用
csv文件是一種逗號(hào)分隔的純文本形式存儲(chǔ)的表格數(shù)據(jù),Python內(nèi)置了CSV模塊,可直接通過該模塊實(shí)現(xiàn)csv文件的讀寫操作,下面這篇文章主要給大家介紹了關(guān)于Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用,需要的朋友可以參考下2022-09-09python??UPX?is?not?available問題解決方法
這篇文章主要介紹了python?UPX?is?not?available問題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Python中關(guān)于logging模塊的學(xué)習(xí)筆記
在本篇文章里小編給大家整理的是一篇關(guān)于Python中l(wèi)ogging模塊相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以參考下。2020-06-06解決使用python print打印函數(shù)返回值多一個(gè)None的問題
這篇文章主要介紹了解決使用python print打印函數(shù)返回值多一個(gè)None的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)
這篇文章主要介紹了K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn),幫助大家更好的利用python實(shí)現(xiàn)機(jī)器學(xué)習(xí),感興趣的朋友可以了解下2021-01-01