深入了解Python的異常處理機(jī)制
什么是異常?
def num(a, b): a = int(a) b = int(b) result = a / b print(result)
上面是一個(gè)很簡(jiǎn)單的除法的函數(shù),語(yǔ)法上沒(méi)有任何問(wèn)題。
但是如果調(diào)用函數(shù)的時(shí)候,傳入字符串。則會(huì)拋出異常ValueError。且后續(xù)代碼不會(huì)執(zhí)行
再比如除數(shù)是0。那也將拋出異常ZeroDivisionError
。且后續(xù)代碼不會(huì)執(zhí)行
異常處理
格式
try: #程序代碼 except [errorNmae]: #出現(xiàn)異常后的處理代碼 [else:] #當(dāng)try中代碼沒(méi)有問(wèn)題時(shí),會(huì)執(zhí)行else。但是try中不能有retrun [finally:] #最后一定會(huì)被執(zhí)行的代碼
try-except?
格式一-try...except...
try: num('a', 'b') except: print('你的程序出現(xiàn)了大問(wèn)題?。?!') print('--------->end')
通過(guò)try-except處理異常,當(dāng)捕獲到異常時(shí),將執(zhí)行except部分的代碼。且程序不會(huì)終端,繼續(xù)向下執(zhí)行。
格式二-try...except {errorName}...
上述處理異常的時(shí)候沒(méi)有區(qū)分異常情況。也可以捕獲異常的name,進(jìn)行不同的處理。
try: num('a', 'b') except ValueError: print('你的參數(shù)格式寫(xiě)的不對(duì)!??!') except ZeroDivisionError: print('你的除數(shù)是0?。?!') print('--------->end')
try: num(10, 0) except ValueError: print('你的參數(shù)格式寫(xiě)的不對(duì)?。?!') except ZeroDivisionError: print('你的除數(shù)是0?。。?) print('--------->end')
格式三-try...except {errorName} as key...
except {errorName} as key
。會(huì)將報(bào)錯(cuò)的信息賦值給key
注意:Python中的錯(cuò)誤類型也是class,所有錯(cuò)誤類型都繼承自BaseException。所以excpt使用時(shí)要注意,如果錯(cuò)誤類型還有子類型,也會(huì)將子類型一網(wǎng)打盡。
try: num(10, 0) except ValueError as error_msg_value: print('你的參數(shù)格式寫(xiě)的不對(duì)!??!', error_msg_value) except ZeroDivisionError as error_msg_zero: print('你的除數(shù)是0?。?!', error_msg_zero) print('--------->end')
這種使用errorName捕獲異常的情況。如果異常沒(méi)有被捕獲到,會(huì)一直向上拋,最終被python解釋器不過(guò)。打印錯(cuò)誤信息。
try-except-finally
無(wú)論是否拋出異常,最后finally都會(huì)執(zhí)行。
try: num('a', 'b') except ZeroDivisionError as error_msg_zero: print('你的除數(shù)是0?。?!', error_msg_zero) finally: print('無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行') print('--------->end')
-------------
輸出:
你的除數(shù)是0?。?! division by zero
無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行
--------->end
但是如果異常沒(méi)有except沒(méi)有捕獲到異常,異常最后由python解釋器拋出。那么finally執(zhí)行完后,后續(xù)的代碼就不會(huì)執(zhí)行了。
try: num('a', 'b') # except ValueError as error_msg_value: # print('你的參數(shù)格式寫(xiě)的不對(duì)!??!', error_msg_value) except ZeroDivisionError as error_msg_zero: print('你的除數(shù)是0?。。?, error_msg_zero) finally: print('無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行') print('--------->end')
try-except-else
當(dāng)try中代碼沒(méi)有問(wèn)題時(shí),會(huì)執(zhí)行else。但是try中不能有retrun。
try: num(10, 2) except ValueError as error_msg_value: print('你的參數(shù)格式寫(xiě)的不對(duì)?。?!', error_msg_value) except ZeroDivisionError as error_msg_zero: print('你的除數(shù)是0?。。?, error_msg_zero) else: print('else') finally: print('無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行') print('--------->end')
?---------------
輸出:
5.0
else
無(wú)論有沒(méi)有異常,finally都會(huì)執(zhí)行
--------->end
拋出異常
格式
raise errorName('error message')
錯(cuò)誤類型名可以自定義,但盡量使用Python內(nèi)置錯(cuò)誤類型。
def num(a, b): result = a / b print(result) if result < 10: raise ValueError('商小于10,不符合預(yù)期。') num(10, 2)
?
raise還可以將一個(gè)錯(cuò)誤類型轉(zhuǎn)換為另一個(gè)錯(cuò)誤類型
def ch_type(): try: result = 10 / 0 except ZeroDivisionError as err_msg: raise Exception(err_msg) ch_type()
原本錯(cuò)誤類型ZeroDivisionError,改成了Exception。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內(nèi)容)
Excel文件中可能包含合并單元格的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas讀取excel合并單元格的正確方式,主要介紹的openpyxl合并單元格拆分并填充內(nèi)容,需要的朋友可以參考下2023-06-06python中的十大%占位符對(duì)應(yīng)的格式化的使用方法
本文主要介紹了python中的十大%占位符對(duì)應(yīng)的格式化的使用方法,它可以很好的幫助我們解決一些字符串格式化的問(wèn)題, 文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-01-01python神經(jīng)網(wǎng)絡(luò)TensorFlow簡(jiǎn)介常用基本操作教程
這篇文章主要介紹了python神經(jīng)網(wǎng)絡(luò)入門(mén)TensorFlow簡(jiǎn)介常用基本操作教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11判斷Threading.start新線程是否執(zhí)行完畢的實(shí)例
這篇文章主要介紹了判斷Threading.start新線程是否執(zhí)行完畢的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05詳解如何利用Python實(shí)現(xiàn)報(bào)表自動(dòng)化
這篇文章主要介紹了報(bào)表自動(dòng)化的流程,并教你用Python實(shí)現(xiàn)工作中的一個(gè)報(bào)表自動(dòng)化實(shí)戰(zhàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03python實(shí)現(xiàn)大文本文件分割成多個(gè)小文件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)大文本文件分割成多個(gè)小文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04python中@contextmanager裝飾器的用法詳解
這篇文章主要介紹了python中@contextmanager裝飾器的用法詳解,@contextmanager 的作用就是我們可以把一個(gè)非自定義類改成一個(gè)上下文管理器,需要的朋友可以參考下2023-07-07Python實(shí)現(xiàn)滑塊驗(yàn)證碼詳解
驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場(chǎng)景中。傳統(tǒng)的字符型驗(yàn)證安全性已經(jīng)名存實(shí)亡的情況下,各種新型的驗(yàn)證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實(shí)現(xiàn)滑塊驗(yàn)證碼2022-05-05Scrapy爬蟲(chóng)文件批量運(yùn)行的實(shí)現(xiàn)
這篇文章主要介紹了Scrapy爬蟲(chóng)文件批量運(yùn)行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09