日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)Python教程:pythonraise什么意思

編寫(xiě)代碼時(shí)能否手動(dòng)拋出一個(gè)異常嗎?答案是肯定的,python 允許程序自行引發(fā)異常,使用 raise 語(yǔ)句即可。基本語(yǔ)法格式為:

成都創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站重做改版、崇明網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為崇明等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

raise [exceptionName [(reason)]]

其中,用 [] 括起來(lái)的為可選參數(shù),其作用是指定拋出的異常名稱(chēng),以及異常信息的相關(guān)描述。如果可選參數(shù)全部省略,則 raise 會(huì)把當(dāng)前錯(cuò)誤原樣拋出;如果僅省略 (reason),則在拋出異常時(shí),將不附帶任何的異常描述信息。

也就是說(shuō),raise 語(yǔ)句有如下三種常用的用法:

1、raise:?jiǎn)为?dú)一個(gè) raise。該語(yǔ)句引發(fā)當(dāng)前上下文中捕獲的異常(比如在 except 塊中),或默認(rèn)引發(fā) RuntimeError 異常。

2、raise 異常類(lèi)名稱(chēng):raise 后帶一個(gè)異常類(lèi)名稱(chēng)。該語(yǔ)句引發(fā)指定異常類(lèi)的默認(rèn)實(shí)例。

3、raise 異常類(lèi)名稱(chēng)(描述信息):在引發(fā)指定異常的同時(shí),附帶異常的描述信息。

上面三種用法最終都是要引發(fā)一個(gè)異常實(shí)例(即使指定的是異常類(lèi),實(shí)際上也是引發(fā)該類(lèi)的默認(rèn)實(shí)例),raise 語(yǔ)句每次只能引發(fā)一個(gè)異常實(shí)例。

例如:

>>> raise
Traceback (most recent call last):
  File "", line 1, in 
    raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "", line 1, in 
    raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除數(shù)不能為零")
Traceback (most recent call last):
  File "", line 1, in 
    raise ZeroDivisionError("除數(shù)不能為零")
ZeroDivisionError: 除數(shù)不能為零

注意,即使是用戶(hù)自行引發(fā)的異常,也可以使用 try except 來(lái)捕獲它。當(dāng)然也可以不管它,讓該異常向上(先調(diào)用者)傳播,如果該異常傳到 Python 解釋器,那么程序就會(huì)中止。

下面示例示范了處理用戶(hù)引發(fā)異常的兩種方式:

def main():
    try:
        # 使用try...except來(lái)捕捉異常
        # 此時(shí)即使程序出現(xiàn)異常,也不會(huì)傳播給main函數(shù)
        mtd(3)
    except Exception as e:
        print('程序出現(xiàn)異常:', e)
    # 不使用try...except捕捉異常,異常會(huì)傳播出來(lái)導(dǎo)致程序中止
    mtd(3)
def mtd(a):
    if a > 0:
        raise ValueError("a的值大于0,不符合要求")
main()

從上面程序可以看到,程序既可在調(diào)用 mtd(3) 時(shí)使用 try except 來(lái)捕獲異常,這樣該異常將會(huì)被 except 塊捕獲;也可直接調(diào)用 mtd(3),這樣該函數(shù)的異常就會(huì)直接導(dǎo)致程序中止。

運(yùn)行上面程序,可以看到如下輸出結(jié)果:

程序出現(xiàn)異常: a的值大于0,不符合要求

Traceback (most recent call last):
  File "C:\Users\mengma\Desktop\1.py", line 13, in 
    main()
  File "C:\Users\mengma\Desktop\1.py", line 9, in main
    mtd(3)
  File "C:\Users\mengma\Desktop\1.py", line 12, in mtd
    raise ValueError("a的值大于0,不符合要求")
ValueError: a的值大于0,不符合要求

上面第一行輸出是第一次調(diào)用 mtd (3) 的結(jié)果,該方法引發(fā)的異常被 except 塊捕獲并處理。后面的大段輸出則是第二次調(diào)用 mtd(3) 的結(jié)果,由于該異常沒(méi)有被 except 塊捕獲,導(dǎo)致程序中止。

第二次調(diào)用 mtd(3) 引發(fā)的以“File”開(kāi)頭的三行輸出,其實(shí)顯示的就是異常的傳播軌跡信息。也就是說(shuō),如果程序不對(duì)異常進(jìn)行處理,Python 默認(rèn)會(huì)在控制臺(tái)輸出異常的傳播軌跡信息。

raise 不需要參數(shù)

正如前面所看到的,在使用 raise 語(yǔ)句時(shí)可以不帶參數(shù),此時(shí) raise 語(yǔ)句處于 except 塊中,它將會(huì)自動(dòng)引發(fā)當(dāng)前上下文激活的異常;否則,通常默認(rèn)引發(fā) RuntimeError 異常。

例如,將上面程序改為如下形式:

class AuctionException(Exception): pass
class AuctionTest:
    def __init__(self, init_price):
        self.init_price = init_price
    def bid(self, bid_price):
        d = 0.0
        try:
            d = float(bid_price)
        except Exception as e:
            # 此處只是簡(jiǎn)單地打印異常信息
            print("轉(zhuǎn)換出異常:", e)
            # 再次引發(fā)自定義異常
            raise
        if self.init_price > d:
            raise AuctionException("競(jìng)拍價(jià)比起拍價(jià)低,不允許競(jìng)拍!")
        initPrice = d
def main():
    at = AuctionTest(20.4)
    try:
        at.bid("df")
    except AuctionException as ae:
        # 再次捕獲到bid()方法中的異常,并對(duì)該異常進(jìn)行處理
        print('main函數(shù)捕捉的異常:', ae)
main()

正如從 13 行代碼所看到的,此時(shí)程序在 except 塊中只是簡(jiǎn)單地使用 raise 語(yǔ)句來(lái)引發(fā)異常,那么該 raise 語(yǔ)句將會(huì)再次引發(fā)該 except 塊所捕獲的異常。運(yùn)行該程序,可以看到如下輸出結(jié)果:

轉(zhuǎn)換出異常: could not convert string to float: 'df'
main 函數(shù)捕獲的異常:

從輸出結(jié)果來(lái)看,此時(shí) main() 函數(shù)再次捕獲了 ValueError,它就是在 bid() 方法中 except 塊所捕獲的原始異常。

except 和 raise 同時(shí)使用

在實(shí)際應(yīng)用中對(duì)異??赡苄枰鼜?fù)雜的處理方式。當(dāng)一個(gè)異常出現(xiàn)時(shí),單靠某個(gè)方法無(wú)法完全處理該異常,必須由幾個(gè)方法協(xié)作才可完全處理該異常。也就是說(shuō),在異常出現(xiàn)的當(dāng)前方法中,程序只對(duì)異常進(jìn)行部分處理,還有些處理需要在該方法的調(diào)用者中才能完成,所以應(yīng)該再次引發(fā)異常,讓該方法的調(diào)用者也能捕獲到異常。

為了實(shí)現(xiàn)這種通過(guò)多個(gè)方法協(xié)作處理同一個(gè)異常的情形,可以在 except 塊中結(jié)合 raise 語(yǔ)句來(lái)完成。如下程序示范了except 和 raise 同時(shí)使用的方法:

class AuctionException(Exception): pass
class AuctionTest:
    def __init__(self, init_price):
        self.init_price = init_price
    def bid(self, bid_price):
        d = 0.0
        try:
            d = float(bid_price)
        except Exception as e:
            # 此處只是簡(jiǎn)單地打印異常信息
            print("轉(zhuǎn)換出異常:", e)
            # 再次引發(fā)自定義異常
            raise AuctionException("競(jìng)拍價(jià)必須是數(shù)值,不能包含其他字符!")  # ①
            raise AuctionException(e)
        if self.init_price > d:
            raise AuctionException("競(jìng)拍價(jià)比起拍價(jià)低,不允許競(jìng)拍!")
        initPrice = d
def main():
    at = AuctionTest(20.4)
    try:
        at.bid("df")
    except AuctionException as ae:
        # 再次捕獲到bid()方法中的異常,并對(duì)該異常進(jìn)行處理
        print('main函數(shù)捕捉的異常:', ae)
main()

上面程序中 9~13 行代碼對(duì)應(yīng)的 except 塊捕獲到異常后,系統(tǒng)打印了該異常的字符串信息,接著引發(fā)一個(gè) AuctionException 異常,通知該方法的調(diào)用者再次處理該 AuctionException 異常。所以程序中的 main() 函數(shù),也就是 bid() 方法的調(diào)用者還可以再次捕獲 AuctionException 異常,井將該異常的詳細(xì)描述信息打印出來(lái)。

這種 except 和 raise 結(jié)合使用的情況在實(shí)際應(yīng)用中非常常用。實(shí)際應(yīng)用對(duì)異常的處理通常分成兩個(gè)部分:

應(yīng)用后臺(tái)需要通過(guò)日志來(lái)記錄異常發(fā)生的詳細(xì)情況;

應(yīng)用還需要根據(jù)異常向應(yīng)用使用者傳達(dá)某種提示;

在這種情形下,所有異常都需要兩個(gè)方法共同完成,也就必須將 except 和 raise 結(jié)合使用。

如果程序需要將原始異常的詳細(xì)信息直接傳播出去,Python 也允許用自定義異常對(duì)原始異常進(jìn)行包裝,只要將上面 ① 號(hào)代碼改為如下形式即可:

raise AuctionException(e)

上面就是把原始異常 e 包裝成了 AuctionException 異常,這種方式也被稱(chēng)為異常包裝或異常轉(zhuǎn)譯。

自定義異常類(lèi)

很多時(shí)候,程序可選擇引發(fā)自定義異常,因?yàn)楫惓5念?lèi)名通常也包含了該異常的有用信息。所以在引發(fā)異常時(shí),應(yīng)該選擇合適的異常類(lèi),從而可以明確地描述該異常情況。在這種情形下,應(yīng)用程序常常需要引發(fā)自定義異常。

用戶(hù)自定義異常都應(yīng)該繼承 Exception 基類(lèi)或 Exception 的子類(lèi),在自定義異常類(lèi)時(shí)基本不需要書(shū)寫(xiě)更多的代碼,只要指定自定義異常類(lèi)的父類(lèi)即可。

下面程序創(chuàng)建了一個(gè)自定義異常類(lèi):

class AuctionException(Exception):
    pass

上面程序創(chuàng)建了 AuctionException 異常類(lèi),該異常類(lèi)不需要類(lèi)體定義,因此使用 pass 語(yǔ)句作為占位符即可。

在大部分情況下,創(chuàng)建自定義異常類(lèi)都可采用與上面程序相似的代碼來(lái)完成,只需改變 AuctionException 異常的類(lèi)名即可,讓該異常的類(lèi)名可以準(zhǔn)確地描述該異常。

python學(xué)習(xí)網(wǎng),大量的免費(fèi)python視頻教程,歡迎在線(xiàn)學(xué)習(xí)!


網(wǎng)站名稱(chēng):創(chuàng)新互聯(lián)Python教程:pythonraise什么意思
文章網(wǎng)址:http://www.dlmjj.cn/article/djodoip.html