摘要:語句就是幫助我們拋出知道異常的,比如的使用很簡單,它的語法如下如果它后面不帶表達式參數,它會重新引發當前作用域內最后一個激活的異常。,用于異常的串聯。自定義的異常類的名稱通常以錯誤結尾,類似與內置標準異常的命名。
前面我們講到的Python編程過程中,在可能出現異常的地方使用嘗試語句,來正確的處理一些異常,可以保證程序不中斷繼續運行。
拋出異常有時候,我們可能需要在程序的某些地方主動拋出異常,通知調用該代碼的程序有錯誤發生這時候,我們就要用到。raise語句。raise語句就是幫助我們拋出知道異常的,比如:
In [6]: raise NameError("Bad Name") ----------------------------------- NameError Traceback (most recent call last)in ----> 1 raise NameError("Bad Name") NameError: Bad Name
raise的使用很簡單,它的語法如下:
raise [expression [from expression]]
如果它后面不帶表達式(參數),它會重新引發當前作用域內最后一個激活的異常。如果當前作用域內沒有激活的異常,將會引發RuntimeError來提示錯誤。
如果后面帶有表達式,則將表達式求值為要拋出的異常對象,該表達式必須是一個異常實例或者是一個異常類(自繼承BaseException類)。如果它是一個異常類,它將通過調用沒有參數的構造函數來隱式實例化:
raise NameError # 等同于 "raise NameError()"
raise后面表達式還可以跟一個from?...。,用于異常的串聯。from子句的表達式必須是另一個異常或實例,它將作為可寫的(可寫入的)的__cause__屬性被關聯到所引發的異常。如果引發的異常未被捕捉處理,兩個異常都將被打印出來:
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
如果異常一個在except[主語]或finally[主語]中被拋出,類似的機制會隱式地發揮作用,的之前將異常關聯被新到異常的__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
串連異常柯林斯通過在from[主語]中用None來顯示地禁止:
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的允許用戶自定義異常類,應該通常直接或間接地繼承自Exception類。
自定義的異常類的名稱通常以“錯誤”結尾,類似與內置標準異常的命名。自定義的異常類,可以像其它類那樣可以執行任何操作,但通常保持簡單,只提供用以處理程序為異常提取有關錯誤信息的屬性為模塊自定義多個不同錯誤的異常時,通常是為該模塊定義一個異常基類,再為不同錯誤創建特定的子類例如。:
class ModuleError(Exception): """模塊的異常基類""" pass class ModuleNameError(ModuleError): """模塊的特定異常子類""" pass class ModuleValueError(ModuleError): """模塊的另一個特定異常子類""" pass最后的清理操作:finally子句
finally的英文[主語]?try語句的一個可選[主語],用于定義在任何情況下都執行的操作,叫做“清理操作”例如:
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子句總會在離開try語句前被執行,無論發生異常與否。當在try子句中發生了異常且尚未被except子句處理(或者它發生在除或其他子句中)時,該異常將在終子句執行后被重新拋出。當try語句的任何其他子句通過break,continue或return語句離開時,最后也會在“離開之前”被執行,參考下面這個更復雜的例子:
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子句總是會被執行。字符串但被除時引發了TypeError的異常,異常這個沒有被except?...。處理,在就會finally?...。執行后被重新拋出。
在編程實踐中,finally子句對釋放文件或網絡連接等外部資源是非常有用的。
總結編程中,我們不僅要在恰當的地方處理異常,也要在必要的時候拋出異常,我們拋出異常時可以自定義異常。熟練運用異常可以使我們的程序更加健壯,別忘了必要的時候使用finally來釋放外部資源。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43846.html
摘要:在前面介紹語法的過程中,我們已經接觸到了解釋器給的錯誤和異常,但并沒有詳細講解它們。解釋器這樣報出的好處是告訴我們哪一行代碼出錯了錯誤的類型是什么。 在前面介紹Python語法的過程中,我們已經接觸到了解釋器給的錯誤和異常,但并沒有詳細講解它們。現在我們就全面的來學習Python是對語法錯誤等錯誤進行定義和處理的,這包括至少有兩種可以區分的錯誤,它們是語法錯誤和異常。 語法錯誤 Pyt...
摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...
摘要:繼續講述更多的的內置函數。傳遞以切換緩沖關閉僅允許在二進制模式下,選擇行緩沖僅在文本模式下可用,并且的整數以指示固定大小的塊緩沖區的大小以字節為單位。啟動內置的幫助系統此函數主要在交互式中使用。 繼續講述更多的Python的內置函數。 showImg(https://segmentfault.com/img/remote/1460000019193976); IO操作 input([p...
?前言 代碼出現異常而報錯再正常不過了,但為什么要處理異常? 由于異常的存在,代碼運行時會出現一大堆的紅色字體提示,對于程序員還好,見紅色報錯見多了習慣了,但如果你開發出來的東西要給別人看,那么不懂代碼的人就會一臉懵逼,對產品的印象都不太好了。 比如我們經常簡單網頁丟失的情況,其實是就是網頁代碼執行時發生了異常,但有的網頁還是很個性的,提示的信息可能是比較人性化的,比如CSDN你收藏的文章被后臺刪...
閱讀 1120·2023-04-26 02:46
閱讀 624·2023-04-25 19:38
閱讀 639·2021-10-14 09:42
閱讀 1234·2021-09-08 09:36
閱讀 1354·2019-08-30 15:44
閱讀 1319·2019-08-29 17:23
閱讀 2237·2019-08-29 15:27
閱讀 801·2019-08-29 14:15