日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python新手學(xué)習(xí)raise用法

瀏覽:174日期:2022-07-23 10:09:34

當(dāng)程序出現(xiàn)錯誤時,系統(tǒng)會自動引發(fā)異常。除此之外,Python 也允許程序自行引發(fā)異常,自行引發(fā)異常使用 raise 語句來完成。

很多時候,系統(tǒng)是否要引發(fā)異常,可能需要根據(jù)應(yīng)用的業(yè)務(wù)需求來決定,如果程序中的數(shù)據(jù)、執(zhí)行與既定的業(yè)務(wù)需求不符,這就是一種異常。由于與業(yè)務(wù)需求不符而產(chǎn)生的異常,必須由程序員來決定引發(fā),系統(tǒng)無法引發(fā)這種異常。

如果需要在程序中自行引發(fā)異常,則應(yīng)使用 raise 語句。raise 語句有如下三種常用的用法:

raise:單獨一個 raise。該語句引發(fā)當(dāng)前上下文中捕獲的異常(比如在 except 塊中),或默認(rèn)引發(fā) RuntimeError 異常。 raise 異常類:raise 后帶一個異常類。該語句引發(fā)指定異常類的默認(rèn)實例。 raise 異常對象:引發(fā)指定的異常對象。

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

可以利用 raise 語句再次改寫前面五子棋游戲中處理用戶輸入的代碼:

try : #將用戶輸入的字符串以逗號( ,)作為分隔符,分隔成兩個字符串 x_str, y_str = inputStr.split(sep =',') #如果要下棋的點不為空 if board[int(y_str) - 1] [int(x_str) - 1] != '+': #引發(fā)默認(rèn)的RuntimeError異常 raise #把對應(yīng)的列表元素賦為”●” board [int(y_str) - 1] [int(x_str) - 1] = ”●”except Exception as e: print (type(e)) inputStr = input('您輸入的坐標(biāo)不合法,請重新輸入,下棋坐標(biāo)應(yīng)以x,y 的格式n') continue

上面程序中第 7 行代碼使用 raise 語句來自行引發(fā)異常,程序認(rèn)為當(dāng)用戶試圖向一個已有棋子的坐標(biāo)點下棋時就是異常。當(dāng) Python 解釋器接收到開發(fā)者自行引發(fā)的異常時,同樣會中止當(dāng)前的執(zhí)行流,跳到該異常對應(yīng)的 except 塊,由該 except 塊來處理該異常。也就是說,不管是系統(tǒng)自動引發(fā)的異常,還是程序員于動引發(fā)的異常,Python 解釋器對異常的處理沒有任何差別。

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

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

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

從上面程序可以看到,程序既可在調(diào)用 mtd(3) 時使用 try except 來捕獲異常,這樣該異常將會被 except 塊捕獲,不會傳播給調(diào)用它的函數(shù);也可直接調(diào)用 mtd(3),這樣該函數(shù)的異常就會直接傳播給它的調(diào)用函數(shù),如果該函數(shù)也不處理該異常,就會導(dǎo)致程序中止。

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

程序出現(xiàn)異常: a的值大于0,不符合要求Traceback (most recent call last):File 'C:UsersmengmaDesktop1.py', line 13, in <module>main()File 'C:UsersmengmaDesktop1.py', line 9, in mainmtd(3)File 'C:UsersmengmaDesktop1.py', line 12, in mtdraise ValueError('a的值大于0,不符合要求')ValueError: a的值大于0,不符合要求

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

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

自定義異常類

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

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

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

class AuctionException(Exception): pass

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

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

except 和 raise 同時使用

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

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

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

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

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

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

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

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

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

raise AuctionException(e)

raise 不需要參數(shù)

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

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

class AuctionException(Exception): passclass 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: # 此處只是簡單地打印異常信息 print('轉(zhuǎn)換出異常:', e) # 再次引發(fā)自定義異常 raise if self.init_price > d: raise AuctionException('競拍價比起拍價低,不允許競拍!') initPrice = ddef main(): at = AuctionTest(20.4) try: at.bid('df') except AuctionException as ae: # 再次捕獲到bid()方法中的異常,并對該異常進行處理 print(’main函數(shù)捕捉的異常:’, ae)main()

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

轉(zhuǎn)換出異常: could not convert string to float: ’df’

main 函數(shù)捕獲的異常:<class ’ValueError’>

知識點補充:

演示raise用法

try: s = None if s is None: print 's 是空對象' raise NameError #如果引發(fā)NameError異常,后面的代碼將不能執(zhí)行 print len(s) #這句不會執(zhí)行,但是后面的except還是會走到except TypeError: print '空對象沒有長度' s = Noneif s is None: raise NameError print ’is here?’ #如果不使用try......except這種形式,那么直接拋出異常,不會執(zhí)行到這里

觸發(fā)異常

我們可以使用raise語句自己觸發(fā)異常

raise語法格式如下:

raise [Exception [, args [, traceback]]]

語句中 Exception 是異常的類型(例如,NameError)參數(shù)標(biāo)準(zhǔn)異常中任一種,args 是自已提供的異常參數(shù)。

最后一個參數(shù)是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。到此這篇關(guān)于Python新手學(xué)習(xí)raise用法的文章就介紹到這了,更多相關(guān)Python中raise用法內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品美女视频 | 桃色一区二区| 精品视频在线观看网站| 精品中文字幕一区二区三区| 蜜臀精品一区二区三区在线观看| 久久国产免费看| 国产美女亚洲精品7777| 国产精品99精品一区二区三区∴ | 国产一二在线播放| 福利一区在线| 精品一区二区三区亚洲| 国产激情在线播放| 91精品啪在线观看国产18| 欧美精品九九| 亚洲久草在线| 国产精品久久久久久久久久白浆 | 国产在线视频欧美一区| 黑森林国产精品av| 日韩欧美少妇| 亚州av乱码久久精品蜜桃| 久久亚洲二区| 欧美一级一区| 三上亚洲一区二区| 国产日产精品一区二区三区四区的观看方式 | 久久免费福利| 欧美激情五月| 香蕉成人av| 亚洲一区二区动漫| 日韩精品视频网| 久久91视频| 青青青免费在线视频| 九九综合在线| 日韩av不卡一区二区| 免费一级欧美片在线观看网站| 国产精品成人一区二区不卡| 婷婷亚洲五月| 91综合久久爱com| 精品视频一区二区三区四区五区| 91精品一区二区三区综合在线爱 | 精品亚洲美女网站| 一区二区电影| 精品无人区麻豆乱码久久久| 性感美女一区二区在线观看| 国产美女一区| 麻豆精品在线观看| 亚洲黄页一区| 久久精品亚洲| 性欧美长视频| 国产一区精品福利| 亚洲影视一区二区三区| 成人精品动漫一区二区三区| 丝袜美腿高跟呻吟高潮一区| 麻豆久久一区| 午夜一区在线| 福利一区和二区| 久久久久一区| 美女福利一区二区三区| 久久国产小视频| 免费人成精品欧美精品| 精品国产中文字幕第一页| 偷拍欧美精品| 国产精品调教| 亚洲成人一区| 国产精品日本一区二区不卡视频 | 99国产精品99久久久久久粉嫩| 青青伊人久久| 久久蜜桃av| 国产精品乱战久久久| 制服诱惑一区二区| 国产第一亚洲| 日本va欧美va瓶| 婷婷六月综合| 在线看片福利| 国产精品网站在线看| 久久成人国产| 日韩和的一区二在线| 欧美日韩一区二区三区不卡视频| 欧美日韩精品在线一区| 麻豆国产精品视频| 亚洲免费专区| 久久精品播放| 日韩a一区二区| 日韩av黄色在线| 国产模特精品视频久久久久| 中文字幕系列一区| 精品中文字幕一区二区三区四区| 日韩在线麻豆| 99国产一区| 免费污视频在线一区| 狠狠久久伊人中文字幕| 国产精品日韩精品中文字幕| 国产精品久久久久77777丨| 免费久久久久久久久| 国产精品男女| 蜜桃久久av一区| 精品国产乱码久久久久久1区2匹| 日本亚洲不卡| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲不卡av不卡一区二区| 精品99久久| 麻豆精品新av中文字幕| 欧美视频二区| 日韩精品久久理论片| 久久午夜精品| 一本色道精品久久一区二区三区| 色88888久久久久久影院| 福利片在线一区二区| 精品一区二区三区的国产在线观看 | 精品在线播放| 日韩精品欧美| 日韩欧美另类一区二区| 久久精品国产99国产| 国产精品黄色片| 欧美天堂一区二区| 欧美欧美黄在线二区| 国产亚洲电影| 国产欧美欧美| 国产欧美69| 国产精品视频一区二区三区四蜜臂 | 麻豆精品久久| 国产精品视频3p| 国产精品对白| 国产精品对白久久久久粗| 国产日韩欧美中文在线| 国产精品一区二区精品| 国产精品.xx视频.xxtv| 久久精品一区二区国产| 久久中文字幕一区二区| 麻豆精品视频在线| 久久一区欧美| 黑森林国产精品av| 亚洲成人va| 99视频精品| 亚洲在线久久| 日本a口亚洲| 国产精品一级在线观看| 久久久国产精品入口麻豆| 国产一区二区三区久久| 正在播放日韩精品| 久久美女精品| 免费日韩av| 日韩一区二区三区高清在线观看| 在线精品国产亚洲| 日韩av一二三| 麻豆久久一区| 日韩av福利| 黑丝一区二区三区| 美美哒免费高清在线观看视频一区二区| 亚洲18在线| 欧美国产免费| 尤物tv在线精品| 蜜臀久久99精品久久久久久9| 日韩av网站免费在线| 开心激情综合| 在线日韩欧美| 亚洲精一区二区三区| 国产福利一区二区三区在线播放| 久久精品国产亚洲aⅴ| 日韩精品诱惑一区?区三区| 欧美日韩国产一区二区三区不卡| 免费观看在线色综合| 国产欧美二区| 亚洲二区免费| 亚洲精品大全| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日韩一级欧洲| 日本不卡在线视频| 国产美女亚洲精品7777| 99成人在线视频| 亚洲色诱最新| 日韩在线网址| 国产一区国产二区国产三区| 亚洲精品在线观看91| 日韩二区三区在线观看| 手机在线电影一区| 国产精品外国| 久久中文精品| 黄色亚洲在线| 国产精品久久久久久久久免费高清| 国产一区二区三区91| 日韩精品一区第一页| 国产一区精品福利| 在线国产精品一区| 久久电影tv| 日韩av不卡在线观看| 久久精品国产大片免费观看| 久久激情五月婷婷| 精品一区在线| 久久精品二区亚洲w码| 蜜桃久久av| 久久uomeier| 日韩激情中文字幕| 欧洲亚洲一区二区三区| 日本91福利区| 亚洲人成在线网站| 国产调教一区二区三区| 欧美精选一区二区三区| 精品五月天堂| 日韩一区网站| 国产精品7m凸凹视频分类|