溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python異常處理的知識點有哪些

發(fā)布時間:2021-11-19 13:37:56 來源:億速云 閱讀:136 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“Python異常處理的知識點有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習“Python異常處理的知識點有哪些”吧!

異常捕獲

首先我們來看一個例子:

Python異常處理的知識點有哪些

我通過 print(a) 讓Python解釋器給我報了一個異常,其中包含錯誤信息的所有上下文信息,代碼路徑、錯誤代碼內(nèi)容、錯誤信息等等。

print(a)這個語句錯誤的原因是在于a這個變量沒有定義 (NameError: name 'a' is not  defined),這在我寫代碼之前就清楚。

然而在實際編程過程中,隨著代碼量的增加,我們有的時候并不確定某個變量是否已經(jīng)被賦值成功,如果變量未被成功的賦值,程序還是按原計劃對其進行操作時可能就會直接報錯。

要解決這個問題有兩個辦法:

  • 對變量進行操作(例如加減法)之前檢查它的值是否已經(jīng)存在,如果不存在,就告訴用戶

  • 捕獲該異常,并且告訴用戶

這兩種辦法的結(jié)果其實都是會告訴用戶錯誤信息,在結(jié)果上并沒有太大的變化,今天我們主要講第二種,異常自動捕獲的方式。

現(xiàn)在我們改造一下剛才的代碼,把異常捕獲到然后自定義處理方式:

Python異常處理的知識點有哪些

以上的代碼例子展示我們通過異常捕獲 try except的語法把錯誤捕獲到,并且自定義了其輸出內(nèi)容。

讓我們來解釋一下這段代碼:

  • try用于定義一個異常捕獲的語法塊。

  • 在try縮進的區(qū)塊里,我們可以正常寫我們想要實現(xiàn)的代碼。

  • 在except區(qū)塊里,我們定義了如果程序報錯后所要執(zhí)行的代碼,在本例子中就是直接打印報錯信息 (報錯信息:name 'a' is not  defined)。

  • except后面的Exception as e 的用處是用于定義錯誤信息類型(Exception),并且將錯誤信息賦值給變量e。

通過在代碼任意位置使用try...except語法,我們可以設(shè)置多個try...except的代碼塊,如果在try中程序正常執(zhí)行沒有報錯,那么程序就會跳過except區(qū)塊,正常執(zhí)行之后的代碼。

異常類型

我們剛才用到Exception這個異常類型,它在Python中是常規(guī)錯誤的基類,如果我們對可能出錯的類型不能確定時就可以使用到它,但是一般不建議這么做。

不直接使用Exception的理由是我們在捕獲到異常時,總是希望能夠?qū)Ξ惓_M行明確的報錯或者處理,如果所有錯誤都是Exception類型,我們其實也不知道程序究竟是在哪里出了錯。

舉個例子來說明這個問題。

Python異常處理的知識點有哪些

通過上面這個例子我們可以學(xué)到兩件事情:

  • except和try是一對多的,有一個try語句,可以有1個或多個 except語句,其用處是定義任意個異常類型和相關(guān)的處理代碼

  • 當異常捕獲發(fā)生后,程序會中斷執(zhí)行,停留在第一個異常報錯的位置。在本例子中因為我們import xxx實際上是引入了一個不存在的模塊名,所以程序報錯 No  module named 'xxx',其錯誤類型是ImportError

現(xiàn)在我們嘗試把import xxx去掉試試。

Python異常處理的知識點有哪些

現(xiàn)在程序報了類型錯誤(TypeError),因為int類型的數(shù)據(jù)無法和str類型的數(shù)字進行加法操作。

下面我給一個Python的常見異常錯誤類型表,供大家參考。

Python異常處理的知識點有哪些

主動拋出異常

上面我們講到了Python如何被動捕獲異常,現(xiàn)在我們來講講主動拋出異常的方法。

為什么要主動拋出異常?

通常我們通過try  except捕獲的異常叫做被動捕獲,它其實是需要程序員進行處理的,比如對錯誤的變量內(nèi)容做一些改正讓其繼續(xù)執(zhí)行。但是主動拋出異常通常不需要再進行處理,程序員已經(jīng)確定這個地方必須拋出異常給用戶,并且中斷程序執(zhí)行,基于這種情況下程序員就不用再對異常進行處理了。

來看一個例子:

Python異常處理的知識點有哪些

在這段代碼里,我們定義了a為一個整型的數(shù)字。

然后通過instance()內(nèi)部函數(shù)判斷a如果不是字符串類型的情況下,就通過raise語句主動拋出一個異常,報錯內(nèi)容也是我們自定義的,其作用就是直接告訴用戶,數(shù)據(jù)出錯了。

有朋友會提一個問題,你自己定義的a = 1,它明明是整型數(shù)字,你還拿去判斷它是不是字符串,這不是多此一舉嗎?它是不是字符串你心里沒點數(shù)嗎?

沒錯,之所以你會有這個問題是因為我們的例子太簡單,假設(shè)變量a的內(nèi)容是來自于另一個模塊呢?或者是來自于爬蟲從網(wǎng)絡(luò)上抓取下來的數(shù)據(jù)?這個時候我們根本不知道a可能是什么內(nèi)容,那么就必須用到異常處理機制了。

raise的語法很簡單:

raise [exceptionName [(reason)]]

在它后面跟上想要拋出的異常類型即可,如果有必要寫上錯誤內(nèi)容的話,就傳進去:

raise ValueError("a必須是字符串")

另外raise語句其實也可以和 try except結(jié)合起來使用:

Python異常處理的知識點有哪些

上面這個例子展現(xiàn)了程序如何主動拋出異常,再由except捕獲并打印錯誤信息。

自定義異常

其實我們剛才了解到所有異常錯誤類型其實都是一個類 (class ),那么我們同樣可以自定義一個異常類,以便于在程序里使用。

Python異常處理的知識點有哪些

通過以上的代碼例子:

  • 我們自定義了一個異常類,叫做CustomerError,繼承自BaseException這個Python異常錯誤類型的基類

  • 然后定義其__init__方法,并用一個變量接受傳入的錯誤信息。

  • __init__方法里可以什么都不做,用一個pass占位即可,因為CustomerError類是繼承自BaseException的,它天生具有BaseException的所有特性。

  • 最后我們拋出一個CustomerError異常,并傳了一個字符串內(nèi)容"自定義異常"進去,由except 捕獲到這個異常并輸出異常內(nèi)容。

到此,相信大家對“Python異常處理的知識點有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI