<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在上一章我們學習了 異常的三個關鍵字,分別是try、except 以及 finally。我們知道在 try 程式碼塊中如果遇到錯誤就會丟擲異常,交給 except 提前定義好的錯誤型別進行匹配並捕獲,如果成功捕獲到異常就會交給 except 的程式碼塊進行執行,最後的 finally 是無論如何都會執行的程式碼塊。
那麼在 try 語法塊中是誰丟擲的異常?優勢如何丟擲的呢?首先丟擲異常的是 Python 的直譯器,它在指令碼執行的時候發現了錯誤並將其丟擲,而如何丟擲的呢?捕獲的異常優勢如何定義的呢?
帶著這樣的疑問,我們就學習一下如何自己書寫一個異常型別,並主動丟擲異常。
當我們學會了自定義一個異常以及主動丟擲異常的時候,就可以主宰一個異常的發生。在之前我們學習的如 NameError 、TypeError … 這些都是 Python 內建給我們定義好的,我們只能老老實實的使用他們。通過今天的學習,我們就可以變被動為主動,因為在實際工作中有太多的場景是 內建的異常所觸及不到的,而這時候使用我們自己定義的異常型別就可以更好的打通業務。
raise 關鍵字的功能:可以將資訊已報錯的形式丟擲
raise 關鍵字的用法:範例如下
# 用法: raise 異常型別(message) # 引數: # message:為要輸出的錯誤資訊 # 這樣的當程式執行到 raise 關鍵字這一行的時候,python 直譯器就會根據 raise 的要求丟擲異常錯誤。 # 返回值: # 因為 raise 關鍵字是丟擲一個異常,所以是沒有返回值的
raise ValueError('使用 raise 主動丟擲異常。') # >>> 執行結果如下: # >>> Traceback (most recent call last): # >>> File "D:PycharmProjectsXXXXXXXXXXXXXXX.py", line 87, in <module> # >>> raise ValueError('使用 raise 主動丟擲異常。') # >>> ValueError: 使用 raise 主動丟擲異常。 # >>> 這裡我們使用的是 ValueError 異常型別,其實我們可以使用任意的異常型別。 # >>> 實在不知道使用什麼異常型別,使用 Exception 也是一個不錯的選擇
def test(num): if num == 100: raise ValueError('傳入的引數 'num' 不可以為100') return num result = test(100) print(result) # >>> 執行結果如下: # >>> Traceback (most recent call last): # >>> File "D:PycharmProjectsXXXXXXXXXXXXXXX.py", line 21, in <module> # >>> result = test(100) # >>> File "D:PycharmProjectsXXXXXXXXXXXXXXX.py", line 17, in test # >>> raise ValueError('傳入的引數 'num' 不可以為100') # >>> ValueError: 傳入的引數 'num' 不可以為100
那麼主動丟擲的 raise 能不能被捕獲呢?我們試一下。
def test(num): if num == 100: raise ValueError('傳入的引數 '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) # >>> 執行結果如下: # >>> 傳入的引數 'num' 不可以為100
再思考一個問題,如果 raise 關鍵字後面不跟隨錯誤型別,僅僅是 字串提示資訊,能否進行丟擲錯誤呢?
def test3(): raise '主動丟擲異常' test3() # >>> 執行結果如下: # >>> Traceback (most recent call last): # >>> File "D:PycharmProjectsXXXXXXXXXXXXXXX.py", line 38, in <module> # >>> test3() # >>> File "D:PycharmProjectsXXXXXXXXXXXXXXX.py", line 36, in test3 # >>> raise '主動丟擲異常' # >>> TypeError: exceptions must derive from BaseException # >>> TypeError: 異常必須得基於基礎異常類 (BaseException:基礎異常類 - 也就是 'Exception') # >>> 這裡的確丟擲了一個異常,但是並不是我們 raise 關鍵字主動丟擲的異常 # >>> 而是 Python直譯器發現 raise 關鍵字的用法不正確丟擲的 TypeError 的 異常型別
由此得出結論: raise 關鍵字 後面必須要配合一個 異常型別 ,才可以正常使用。
Exception 是一個通用異常型別,在我們不知道、不確定該使用什麼異常型別的時候,就可以通過 Exception 來捕獲 或者 結合 raise 關鍵字主動丟擲異常。
同時 Exception 是所有異常型別的基礎類別(父類別),所以如果我們想要自定義一個異常型別,就需要繼承 Exception 基礎類別 。
基礎類別繼承之後我們還需要 自定義一個錯誤的訊息;滿足這兩個條件之後,我們就可以去自定義一個異常類。
總結:
來看一個範例:
class NewError(Exception): def __init__(self, message): self.message = message def test(): raise NewError('這是一個自定義異常') try: test() except NewError as e: print(e) # >>> 執行結果如下: # >>> 這是一個自定義異常
接下來 我們自定義一個檢查 name 傳參的異常,然後進行校驗
class CheckNameError(Exception): def __init__(self, message): self.message = message def check_name(name): if name == 'Neo': raise CheckNameError(''Neo'的名字不可以作為傳參引數') return name try: check_name('Neo') except CheckNameError as e: print(e) # >>> 執行結果如下: # >>> Neo'的名字不可以作為傳參引數 # 嘗試一下如果不使用我們 try 捕獲我們的自定義異常試試 class CheckNameError(Exception): def __init__(self, message): self.message = message def check_name(name): if name == 'Neo': raise CheckNameError(''Neo'的名字不可以作為傳參引數') return name check_name('Neo') # >>> 執行結果如下: # >>> __main__.CheckNameError: 'Neo'的名字不可以作為傳參引數
該章節我們主要學習如何自定義丟擲一個異常,以及如何自動定義一個異常型別。
在工作中,定義一個符合業務場景的異常型別,可以更適合我們的開發與錯誤顯示。
到此這篇關於Python學習之自定義異常詳解的文章就介紹到這了,更多相關Python自定義異常內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45