Python學習之自定義異常詳解
在上一章我們學習了 異常的三個關鍵字,分別是try、except 以及 finally。我們知道在 try 代碼塊中如果遇到錯誤就會拋出異常,交給 except 提前定義好的錯誤類型進行匹配并捕獲,如果成功捕獲到異常就會交給 except 的代碼塊進行執(zhí)行,最后的 finally 是無論如何都會執(zhí)行的代碼塊。
那么在 try 語法塊中是誰拋出的異常?優(yōu)勢如何拋出的呢?首先拋出異常的是 Python 的解釋器,它在腳本執(zhí)行的時候發(fā)現(xiàn)了錯誤并將其拋出,而如何拋出的呢?捕獲的異常優(yōu)勢如何定義的呢?
帶著這樣的疑問,我們就學習一下如何自己書寫一個異常類型,并主動拋出異常。
當我們學會了自定義一個異常以及主動拋出異常的時候,就可以主宰一個異常的發(fā)生。在之前我們學習的如 NameError 、TypeError … 這些都是 Python 內置給我們定義好的,我們只能老老實實的使用他們。通過今天的學習,我們就可以變被動為主動,因為在實際工作中有太多的場景是 內置的異常所觸及不到的,而這時候使用我們自己定義的異常類型就可以更好的打通業(yè)務。
自定義拋出異常關鍵字 - raise
raise 關鍵字的功能:可以將信息已報錯的形式拋出
raise 關鍵字的用法:示例如下
# 用法: raise 異常類型(message) # 參數(shù): # message:為要輸出的錯誤信息 # 這樣的當程序執(zhí)行到 raise 關鍵字這一行的時候,python 解釋器就會根據(jù) raise 的要求拋出異常錯誤。 # 返回值: # 因為 raise 關鍵字是拋出一個異常,所以是沒有返回值的
演示小案例 - 1
raise ValueError('使用 raise 主動拋出異常。')
# >>> 執(zhí)行結果如下:
# >>> Traceback (most recent call last):
# >>> ? File "D:\PycharmProjects\XXXXX\XXXXX\XXXXX.py", line 87, in <module>
# >>> ? ? raise ValueError('使用 raise 主動拋出異常。')
# >>> ValueError: 使用 raise 主動拋出異常。
# >>> 這里我們使用的是 ValueError 異常類型,其實我們可以使用任意的異常類型。
# >>> 實在不知道使用什么異常類型,使用 Exception 也是一個不錯的選擇演示小案例 - 2
def test(num):
? ? if num == 100:
? ? ? ? raise ValueError('傳入的參數(shù) \'num\' 不可以為100')
? ? return num
result = test(100)
print(result)
# >>> 執(zhí)行結果如下:
# >>> 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那么主動拋出的 raise 能不能被捕獲呢?我們試一下。
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í)行結果如下:
# >>> 傳入的參數(shù) 'num' 不可以為100再思考一個問題,如果 raise 關鍵字后面不跟隨錯誤類型,僅僅是 字符串提示信息,能否進行拋出錯誤呢?
def test3(): ? ? raise '主動拋出異常' test3() # >>> 執(zhí)行結果如下: # >>> 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 '主動拋出異常' # >>> TypeError: exceptions must derive from BaseException # >>> TypeError: 異常必須得基于基礎異常類 (BaseException:基礎異常類 - 也就是 'Exception') # >>> 這里的確拋出了一個異常,但是并不是我們 raise 關鍵字主動拋出的異常 # >>> 而是 Python解釋器發(fā)現(xiàn) raise 關鍵字的用法不正確拋出的 TypeError 的 異常類型
由此得出結論: raise 關鍵字 后面必須要配合一個 異常類型 ,才可以正常使用。
自定義異常類
Exception 是一個通用異常類型,在我們不知道、不確定該使用什么異常類型的時候,就可以通過 Exception 來捕獲 或者 結合 raise 關鍵字主動拋出異常。
同時 Exception 是所有異常類型的基類(父類),所以如果我們想要自定義一個異常類型,就需要繼承 Exception 基類 。
基類繼承之后我們還需要 自定義一個錯誤的消息;滿足這兩個條件之后,我們就可以去自定義一個異常類。
總結:
- 自定義異常必須繼承基類:Exception
- 需要在構造函數(shù)中自定義錯誤的信息
來看一個示例:
class NewError(Exception):
? ? def __init__(self, message):
? ? ? ? self.message = message
def test():
? ? raise NewError('這是一個自定義異常')
try:
? ? test()
except NewError as e:
? ? print(e)
? ??
# >>> 執(zhí)行結果如下:
# >>> 這是一個自定義異常接下來 我們自定義一個檢查 name 傳參的異常,然后進行校驗
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í)行結果如下:
# >>> 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í)行結果如下:
# >>> __main__.CheckNameError: 'Neo'的名字不可以作為傳參參數(shù)總結
該章節(jié)我們主要學習如何自定義拋出一個異常,以及如何自動定義一個異常類型。
在工作中,定義一個符合業(yè)務場景的異常類型,可以更適合我們的開發(fā)與錯誤顯示。
到此這篇關于Python學習之自定義異常詳解的文章就介紹到這了,更多相關Python自定義異常內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)批量提取Excel數(shù)據(jù)
在數(shù)據(jù)處理和分析的過程中,Excel 是一種廣泛使用的數(shù)據(jù)存儲格式,本文將詳細介紹如何使用 pandas、openpyxl 和 xlrd 三種庫來批量提取 Excel 數(shù)據(jù),并提供相應的示例代碼,需要的可以參考下2024-12-12
Python中用altzone()方法處理時區(qū)的教程
這篇文章主要介紹了Python中用altzone()方法處理時區(qū)的教程,是Python入門中的基礎知識,需要的朋友可以參考下2015-05-05
python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法
今天小編就為大家分享一篇python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

