Python學(xué)習(xí)之自定義異常詳解
在上一章我們學(xué)習(xí)了 異常的三個(gè)關(guān)鍵字,分別是try、except 以及 finally。我們知道在 try 代碼塊中如果遇到錯(cuò)誤就會(huì)拋出異常,交給 except 提前定義好的錯(cuò)誤類型進(jìn)行匹配并捕獲,如果成功捕獲到異常就會(huì)交給 except 的代碼塊進(jìn)行執(zhí)行,最后的 finally 是無論如何都會(huì)執(zhí)行的代碼塊。
那么在 try 語法塊中是誰拋出的異常??jī)?yōu)勢(shì)如何拋出的呢?首先拋出異常的是 Python 的解釋器,它在腳本執(zhí)行的時(shí)候發(fā)現(xiàn)了錯(cuò)誤并將其拋出,而如何拋出的呢?捕獲的異常優(yōu)勢(shì)如何定義的呢?
帶著這樣的疑問,我們就學(xué)習(xí)一下如何自己書寫一個(gè)異常類型,并主動(dòng)拋出異常。
當(dāng)我們學(xué)會(huì)了自定義一個(gè)異常以及主動(dòng)拋出異常的時(shí)候,就可以主宰一個(gè)異常的發(fā)生。在之前我們學(xué)習(xí)的如 NameError 、TypeError … 這些都是 Python 內(nèi)置給我們定義好的,我們只能老老實(shí)實(shí)的使用他們。通過今天的學(xué)習(xí),我們就可以變被動(dòng)為主動(dòng),因?yàn)樵趯?shí)際工作中有太多的場(chǎng)景是 內(nèi)置的異常所觸及不到的,而這時(shí)候使用我們自己定義的異常類型就可以更好的打通業(yè)務(wù)。
自定義拋出異常關(guān)鍵字 - raise
raise 關(guān)鍵字的功能:可以將信息已報(bào)錯(cuò)的形式拋出
raise 關(guān)鍵字的用法:示例如下
# 用法: raise 異常類型(message) # 參數(shù): # message:為要輸出的錯(cuò)誤信息 # 這樣的當(dāng)程序執(zhí)行到 raise 關(guān)鍵字這一行的時(shí)候,python 解釋器就會(huì)根據(jù) raise 的要求拋出異常錯(cuò)誤。 # 返回值: # 因?yàn)?raise 關(guān)鍵字是拋出一個(gè)異常,所以是沒有返回值的
演示小案例 - 1
raise ValueError('使用 raise 主動(dòng)拋出異常。') # >>> 執(zhí)行結(jié)果如下: # >>> Traceback (most recent call last): # >>> ? File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 87, in <module> # >>> ? ? raise ValueError('使用 raise 主動(dòng)拋出異常。') # >>> ValueError: 使用 raise 主動(dòng)拋出異常。 # >>> 這里我們使用的是 ValueError 異常類型,其實(shí)我們可以使用任意的異常類型。 # >>> 實(shí)在不知道使用什么異常類型,使用 Exception 也是一個(gè)不錯(cuò)的選擇
演示小案例 - 2
def test(num): ? ? if num == 100: ? ? ? ? raise ValueError('傳入的參數(shù) \'num\' 不可以為100') ? ? return num result = test(100) print(result) # >>> 執(zhí)行結(jié)果如下: # >>> Traceback (most recent call last): # >>> ? File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 21, in <module> # >>> ? ? result = test(100) # >>> ? File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 17, in test # >>> ? ? raise ValueError('傳入的參數(shù) \'num\' 不可以為100') # >>> ValueError: 傳入的參數(shù) 'num' 不可以為100
那么主動(dòng)拋出的 raise 能不能被捕獲呢?我們?cè)囈幌隆?/p>
def test(num): ? ? if num == 100: ? ? ? ? raise ValueError('傳入的參數(shù) \'num\' 不可以為100') ? ? return num # result = test(100) def test2(num): ? ? try: ? ? ? ? return test(num) ? ? except ValueError as e: ? ? ? ? return e result = test2(100) print(result) # >>> 執(zhí)行結(jié)果如下: # >>> 傳入的參數(shù) 'num' 不可以為100
再思考一個(gè)問題,如果 raise 關(guān)鍵字后面不跟隨錯(cuò)誤類型,僅僅是 字符串提示信息,能否進(jìn)行拋出錯(cuò)誤呢?
def test3(): ? ? raise '主動(dòng)拋出異常' test3() # >>> 執(zhí)行結(jié)果如下: # >>> Traceback (most recent call last): # >>> ? File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 38, in <module> # >>> ? ? test3() # >>> ? File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 36, in test3 # >>> ? ?raise '主動(dòng)拋出異常' # >>> TypeError: exceptions must derive from BaseException # >>> TypeError: 異常必須得基于基礎(chǔ)異常類 (BaseException:基礎(chǔ)異常類 - 也就是 'Exception') # >>> 這里的確拋出了一個(gè)異常,但是并不是我們 raise 關(guān)鍵字主動(dòng)拋出的異常 # >>> 而是 Python解釋器發(fā)現(xiàn) raise 關(guān)鍵字的用法不正確拋出的 TypeError 的 異常類型
由此得出結(jié)論: raise 關(guān)鍵字 后面必須要配合一個(gè) 異常類型 ,才可以正常使用。
自定義異常類
Exception 是一個(gè)通用異常類型,在我們不知道、不確定該使用什么異常類型的時(shí)候,就可以通過 Exception 來捕獲 或者 結(jié)合 raise 關(guān)鍵字主動(dòng)拋出異常。
同時(shí) Exception 是所有異常類型的基類(父類),所以如果我們想要自定義一個(gè)異常類型,就需要繼承 Exception 基類 。
基類繼承之后我們還需要 自定義一個(gè)錯(cuò)誤的消息;滿足這兩個(gè)條件之后,我們就可以去自定義一個(gè)異常類。
總結(jié):
- 自定義異常必須繼承基類:Exception
- 需要在構(gòu)造函數(shù)中自定義錯(cuò)誤的信息
來看一個(gè)示例:
class NewError(Exception): ? ? def __init__(self, message): ? ? ? ? self.message = message def test(): ? ? raise NewError('這是一個(gè)自定義異常') try: ? ? test() except NewError as e: ? ? print(e) ? ?? # >>> 執(zhí)行結(jié)果如下: # >>> 這是一個(gè)自定義異常
接下來 我們自定義一個(gè)檢查 name 傳參的異常,然后進(jìn)行校驗(yàn)
class CheckNameError(Exception): ? ? def __init__(self, message): ? ? ? ? self.message = message def check_name(name): ? ? if name == 'Neo': ? ? ? ? raise CheckNameError('\'Neo\'的名字不可以作為傳參參數(shù)') ? ? return name try: ? ? check_name('Neo') except CheckNameError as e: ? ? print(e) ? ?? # >>> 執(zhí)行結(jié)果如下: # >>> Neo'的名字不可以作為傳參參數(shù) ? ? # 嘗試一下如果不使用我們 try 捕獲我們的自定義異常試試 class CheckNameError(Exception): ? ? def __init__(self, message): ? ? ? ? self.message = message def check_name(name): ? ? if name == 'Neo': ? ? ? ? raise CheckNameError('\'Neo\'的名字不可以作為傳參參數(shù)') ? ? return name check_name('Neo') # >>> 執(zhí)行結(jié)果如下: # >>> __main__.CheckNameError: 'Neo'的名字不可以作為傳參參數(shù)
總結(jié)
該章節(jié)我們主要學(xué)習(xí)如何自定義拋出一個(gè)異常,以及如何自動(dòng)定義一個(gè)異常類型。
在工作中,定義一個(gè)符合業(yè)務(wù)場(chǎng)景的異常類型,可以更適合我們的開發(fā)與錯(cuò)誤顯示。
到此這篇關(guān)于Python學(xué)習(xí)之自定義異常詳解的文章就介紹到這了,更多相關(guān)Python自定義異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲學(xué)習(xí)之獲取指定網(wǎng)頁源碼
這篇文章主要為大家詳細(xì)介紹了Python爬蟲學(xué)習(xí)之獲取指定網(wǎng)頁源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Python編寫檢測(cè)數(shù)據(jù)庫SA用戶的方法
這篇文章主要介紹了Python編寫檢測(cè)數(shù)據(jù)庫SA用戶的方法,需要的朋友可以參考下2014-07-07Python PyQt5實(shí)戰(zhàn)項(xiàng)目之網(wǎng)速監(jiān)控器的實(shí)現(xiàn)
PyQt5以一套Python模塊的形式來實(shí)現(xiàn)功能。它包含了超過620個(gè)類,600個(gè)方法和函數(shù)。它是一個(gè)多平臺(tái)的工具套件,它可以運(yùn)行在所有的主流操作系統(tǒng)中,包含Unix,Windows和Mac OS。PyQt5采用雙重許可模式。開發(fā)者可以在GPL和社區(qū)授權(quán)之間選擇2021-11-11Alpine安裝Python3依賴出現(xiàn)的問題及解決方法
這篇文章主要介紹了Alpine安裝Python3依賴出現(xiàn)的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12pytorch 批次遍歷數(shù)據(jù)集打印數(shù)據(jù)的例子
今天小編就為大家分享一篇pytorch 批次遍歷數(shù)據(jù)集打印數(shù)據(jù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python3.10動(dòng)態(tài)修改Windows系統(tǒng)本地IP地址
這篇文章主要介紹了Python3.10動(dòng)態(tài)修改Windows系統(tǒng)本地IP地址,需要的朋友可以參考下2023-05-05