最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python學(xué)習(xí)之自定義異常詳解

 更新時(shí)間:2022年03月16日 08:29:57   作者:渴望力量的哈士奇  
這篇文章主要為大家介紹了Python中如何自定義異常,以及自定義拋出異常的關(guān)鍵字—raise的用法,文中示例代碼講解詳細(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 語法塊中是誰拋出的異常?優(yōu)勢如何拋出的呢?首先拋出異常的是 Python 的解釋器,它在腳本執(zhí)行的時(shí)候發(fā)現(xiàn)了錯(cuò)誤并將其拋出,而如何拋出的呢?捕獲的異常優(yōu)勢如何定義的呢?

帶著這樣的疑問,我們就學(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í)際工作中有太多的場景是 內(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 能不能被捕獲呢?我們試一下。

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ù)場景的異常類型,可以更適合我們的開發(fā)與錯(cuò)誤顯示。

到此這篇關(guān)于Python學(xué)習(xí)之自定義異常詳解的文章就介紹到這了,更多相關(guān)Python自定義異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Python Matplot中文顯示完美解決方案

    詳解Python Matplot中文顯示完美解決方案

    這篇文章主要介紹了Python Matplot中文顯示完美解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Python實(shí)現(xiàn)批量提取Excel數(shù)據(jù)

    Python實(shí)現(xiàn)批量提取Excel數(shù)據(jù)

    在數(shù)據(jù)處理和分析的過程中,Excel 是一種廣泛使用的數(shù)據(jù)存儲(chǔ)格式,本文將詳細(xì)介紹如何使用 pandas、openpyxl 和 xlrd 三種庫來批量提取 Excel 數(shù)據(jù),并提供相應(yīng)的示例代碼,需要的可以參考下
    2024-12-12
  • Python批量安裝卸載1000個(gè)apk的方法

    Python批量安裝卸載1000個(gè)apk的方法

    這篇文章主要介紹了Python批量安裝卸載1000個(gè)apk的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • django框架中間件原理與用法詳解

    django框架中間件原理與用法詳解

    這篇文章主要介紹了django框架中間件原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架常用中間件與基本使用技巧,需要的朋友可以參考下
    2019-12-12
  • Python中用altzone()方法處理時(shí)區(qū)的教程

    Python中用altzone()方法處理時(shí)區(qū)的教程

    這篇文章主要介紹了Python中用altzone()方法處理時(shí)區(qū)的教程,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • PyCharm中安裝PIL/Pillow的方法

    PyCharm中安裝PIL/Pillow的方法

    這篇文章主要介紹了PyCharm中PIL/Pillow的安裝,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • python opencv讀mp4視頻的實(shí)例

    python opencv讀mp4視頻的實(shí)例

    今天小編就為大家分享一篇python opencv讀mp4視頻的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法

    python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法

    今天小編就為大家分享一篇python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python得到一個(gè)excel的全部sheet標(biāo)簽值方法

    python得到一個(gè)excel的全部sheet標(biāo)簽值方法

    今天小編就為大家分享一篇python得到一個(gè)excel的全部sheet標(biāo)簽值方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python 中文編碼亂碼問題的解決

    python 中文編碼亂碼問題的解決

    中文編碼問題一直是程序員頭疼的問題,本文將盡量用通俗的語言帶大家徹底的了解字符編碼以及Python2和3中的各種編碼問題。感興趣的可以了解一下
    2021-11-11

最新評論

双峰县| 象州县| 友谊县| 汶上县| 柘荣县| 宜春市| 武宁县| 永德县| 峨眉山市| 汶川县| 武威市| 辉南县| 靖安县| 奈曼旗| 长宁区| 历史| 平定县| 白朗县| 滨州市| 论坛| 黄梅县| 隆回县| 新沂市| 西充县| 太仆寺旗| 博客| 渭南市| 罗山县| 河北省| 马山县| 探索| 开封市| 临江市| 嫩江县| 金沙县| 娄烦县| 安丘市| 错那县| 禹城市| 龙胜| 益阳市|