摘要:語(yǔ)句就是幫助我們拋出知道異常的,比如的使用很簡(jiǎn)單,它的語(yǔ)法如下如果它后面不帶表達(dá)式參數(shù),它會(huì)重新引發(fā)當(dāng)前作用域內(nèi)最后一個(gè)激活的異常。,用于異常的串聯(lián)。自定義的異常類(lèi)的名稱通常以錯(cuò)誤結(jié)尾,類(lèi)似與內(nèi)置標(biāo)準(zhǔn)異常的命名。
前面我們講到的Python編程過(guò)程中,在可能出現(xiàn)異常的地方使用嘗試語(yǔ)句,來(lái)正確的處理一些異常,可以保證程序不中斷繼續(xù)運(yùn)行。
拋出異常有時(shí)候,我們可能需要在程序的某些地方主動(dòng)拋出異常,通知調(diào)用該代碼的程序有錯(cuò)誤發(fā)生這時(shí)候,我們就要用到。raise語(yǔ)句。raise語(yǔ)句就是幫助我們拋出知道異常的,比如:
In [6]: raise NameError("Bad Name") ----------------------------------- NameError Traceback (most recent call last)in ----> 1 raise NameError("Bad Name") NameError: Bad Name
raise的使用很簡(jiǎn)單,它的語(yǔ)法如下:
raise [expression [from expression]]
如果它后面不帶表達(dá)式(參數(shù)),它會(huì)重新引發(fā)當(dāng)前作用域內(nèi)最后一個(gè)激活的異常。如果當(dāng)前作用域內(nèi)沒(méi)有激活的異常,將會(huì)引發(fā)RuntimeError來(lái)提示錯(cuò)誤。
如果后面帶有表達(dá)式,則將表達(dá)式求值為要拋出的異常對(duì)象,該表達(dá)式必須是一個(gè)異常實(shí)例或者是一個(gè)異常類(lèi)(自繼承BaseException類(lèi))。如果它是一個(gè)異常類(lèi),它將通過(guò)調(diào)用沒(méi)有參數(shù)的構(gòu)造函數(shù)來(lái)隱式實(shí)例化:
raise NameError # 等同于 "raise NameError()"
raise后面表達(dá)式還可以跟一個(gè)from?...。,用于異常的串聯(lián)。from子句的表達(dá)式必須是另一個(gè)異常或?qū)嵗鼘⒆鳛榭蓪?xiě)的(可寫(xiě)入的)的__cause__屬性被關(guān)聯(lián)到所引發(fā)的異常。如果引發(fā)的異常未被捕捉處理,兩個(gè)異常都將被打印出來(lái):
In [9]: try: ...: print(10/0) ...: except Exception as e: ...: raise RuntimeError("something is wrong") from e ...: ---------------------------------------------------------- ZeroDivisionError Traceback (most recent call last)in 1 try: ----> 2 print(10/0) 3 except Exception as e: ZeroDivisionError: division by zero The above exception was the direct cause of the following exception: RuntimeError Traceback (most recent call last) in 2 print(10/0) 3 except Exception as e: ----> 4 raise RuntimeError("something is wrong") from e 5 RuntimeError: something is wrong
如果異常一個(gè)在except[主語(yǔ)]或finally[主語(yǔ)]中被拋出,類(lèi)似的機(jī)制會(huì)隱式地發(fā)揮作用,的之前將異常關(guān)聯(lián)被新到異常的__context__屬性例如:
In [10]: try: ...: print(10/0) ...: except: ...: raise RuntimeError("something is wrong") ...: ----------------------------------------------- ZeroDivisionError Traceback (most recent call last)in 1 try: ----> 2 print(10/0) 3 except: ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: RuntimeError Traceback (most recent call last) in 2 print(10/0) 3 except: ----> 4 raise RuntimeError("something is wrong") 5 RuntimeError: something is wrong
串連異常柯林斯通過(guò)在from[主語(yǔ)]中用None來(lái)顯示地禁止:
In [11]: try: ...: print(10/0) ...: except: ...: raise RuntimeError("something is wrong") from None ...: ------------------------------- RuntimeError Traceback (most recent call last)用戶自定義異常in 2 print(10/0) 3 except: ----> 4 raise RuntimeError("something is wrong") from None 5 RuntimeError: something is wrong
Python的允許用戶自定義異常類(lèi),應(yīng)該通常直接或間接地繼承自Exception類(lèi)。
自定義的異常類(lèi)的名稱通常以“錯(cuò)誤”結(jié)尾,類(lèi)似與內(nèi)置標(biāo)準(zhǔn)異常的命名。自定義的異常類(lèi),可以像其它類(lèi)那樣可以執(zhí)行任何操作,但通常保持簡(jiǎn)單,只提供用以處理程序?yàn)楫惓L崛∮嘘P(guān)錯(cuò)誤信息的屬性為模塊自定義多個(gè)不同錯(cuò)誤的異常時(shí),通常是為該模塊定義一個(gè)異常基類(lèi),再為不同錯(cuò)誤創(chuàng)建特定的子類(lèi)例如。:
class ModuleError(Exception): """模塊的異常基類(lèi)""" pass class ModuleNameError(ModuleError): """模塊的特定異常子類(lèi)""" pass class ModuleValueError(ModuleError): """模塊的另一個(gè)特定異常子類(lèi)""" pass最后的清理操作:finally子句
finally的英文[主語(yǔ)]?try語(yǔ)句的一個(gè)可選[主語(yǔ)],用于定義在任何情況下都執(zhí)行的操作,叫做“清理操作”例如:
In [12]: try: ...: raise NameError ...: finally: ...: print("Bye :)") ...: ...: Bye :) ------------------------------- NameError Traceback (most recent call last)in 1 try: ----> 2 raise NameError 3 finally: 4 print("Bye :)") 5 NameError:
finally子句總會(huì)在離開(kāi)try語(yǔ)句前被執(zhí)行,無(wú)論發(fā)生異常與否。當(dāng)在try子句中發(fā)生了異常且尚未被except子句處理(或者它發(fā)生在除或其他子句中)時(shí),該異常將在終子句執(zhí)行后被重新拋出。當(dāng)try語(yǔ)句的任何其他子句通過(guò)break,continue或return語(yǔ)句離開(kāi)時(shí),最后也會(huì)在“離開(kāi)之前”被執(zhí)行,參考下面這個(gè)更復(fù)雜的例子:
In [13]: def divide(a, b): ...: try: ...: result = a / b ...: except ZeroDivisionError: ...: print("divided by zero!") ...: else: ...: print("result is", result) ...: finally: ...: print("leaving try") ...: In [14]: divide(8, 2) result is 4.0 leaving try In [15]: divide(8, 0) divided by zero! leaving try In [16]: divide("a", 2) leaving try ----------------------- TypeError Traceback (most recent call last)in ----> 1 divide("a", 2) in divide(a, b) 1 def divide(a, b): 2 try: ----> 3 result = a / b 4 except ZeroDivisionError: 5 print("divided by zero!") TypeError: unsupported operand type(s) for /: "str" and "int"
從上面的例子我們看到,finally子句總是會(huì)被執(zhí)行。字符串但被除時(shí)引發(fā)了TypeError的異常,異常這個(gè)沒(méi)有被except?...。處理,在就會(huì)finally?...。執(zhí)行后被重新拋出。
在編程實(shí)踐中,finally子句對(duì)釋放文件或網(wǎng)絡(luò)連接等外部資源是非常有用的。
總結(jié)編程中,我們不僅要在恰當(dāng)?shù)牡胤教幚懋惓#惨诒匾臅r(shí)候拋出異常,我們拋出異常時(shí)可以自定義異常。熟練運(yùn)用異常可以使我們的程序更加健壯,別忘了必要的時(shí)候使用finally來(lái)釋放外部資源。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43846.html
摘要:在前面介紹語(yǔ)法的過(guò)程中,我們已經(jīng)接觸到了解釋器給的錯(cuò)誤和異常,但并沒(méi)有詳細(xì)講解它們。解釋器這樣報(bào)出的好處是告訴我們哪一行代碼出錯(cuò)了錯(cuò)誤的類(lèi)型是什么。 在前面介紹Python語(yǔ)法的過(guò)程中,我們已經(jīng)接觸到了解釋器給的錯(cuò)誤和異常,但并沒(méi)有詳細(xì)講解它們。現(xiàn)在我們就全面的來(lái)學(xué)習(xí)Python是對(duì)語(yǔ)法錯(cuò)誤等錯(cuò)誤進(jìn)行定義和處理的,這包括至少有兩種可以區(qū)分的錯(cuò)誤,它們是語(yǔ)法錯(cuò)誤和異常。 語(yǔ)法錯(cuò)誤 Pyt...
摘要:楚江數(shù)據(jù)是專(zhuān)業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲(chóng)軟件定制開(kāi)發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類(lèi)信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專(zhuān)業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲(chóng)學(xué)習(xí)系列教程(來(lái)源于某博主:htt...
摘要:繼續(xù)講述更多的的內(nèi)置函數(shù)。傳遞以切換緩沖關(guān)閉僅允許在二進(jìn)制模式下,選擇行緩沖僅在文本模式下可用,并且的整數(shù)以指示固定大小的塊緩沖區(qū)的大小以字節(jié)為單位。啟動(dòng)內(nèi)置的幫助系統(tǒng)此函數(shù)主要在交互式中使用。 繼續(xù)講述更多的Python的內(nèi)置函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019193976); IO操作 input([p...
?前言 代碼出現(xiàn)異常而報(bào)錯(cuò)再正常不過(guò)了,但為什么要處理異常? 由于異常的存在,代碼運(yùn)行時(shí)會(huì)出現(xiàn)一大堆的紅色字體提示,對(duì)于程序員還好,見(jiàn)紅色報(bào)錯(cuò)見(jiàn)多了習(xí)慣了,但如果你開(kāi)發(fā)出來(lái)的東西要給別人看,那么不懂代碼的人就會(huì)一臉懵逼,對(duì)產(chǎn)品的印象都不太好了。 比如我們經(jīng)常簡(jiǎn)單網(wǎng)頁(yè)丟失的情況,其實(shí)是就是網(wǎng)頁(yè)代碼執(zhí)行時(shí)發(fā)生了異常,但有的網(wǎng)頁(yè)還是很個(gè)性的,提示的信息可能是比較人性化的,比如CSDN你收藏的文章被后臺(tái)刪...
閱讀 1133·2023-04-26 02:46
閱讀 634·2023-04-25 19:38
閱讀 647·2021-10-14 09:42
閱讀 1247·2021-09-08 09:36
閱讀 1363·2019-08-30 15:44
閱讀 1329·2019-08-29 17:23
閱讀 2247·2019-08-29 15:27
閱讀 810·2019-08-29 14:15