掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
我曾經(jīng)幫很多人修過電腦,排除硬件問題、排除系統(tǒng)問題、網(wǎng)絡(luò)問題等等。

10年積累的成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有天鎮(zhèn)免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
在修電腦的過程中比如電腦無法開機,我就會假定它某個配件已經(jīng)壞掉了,就先從電源開始排查起、CPU、內(nèi)存、主板等等一個一個的測試,看看究竟是哪一個配件有問題。
如果操作系統(tǒng)系統(tǒng)速度變慢同樣也可以用類似的辦法,先看當(dāng)前占用進程有沒有不必要啟動的、是否有病毒、系統(tǒng)是否沒有優(yōu)化等等。
實際上在編程過程中,我們一樣會假定某段代碼某個功能可能會出現(xiàn)問題的方式來編寫我們的代碼。
今天我們主要來講講Python語言的異常處理相關(guān)知識。
異常捕獲
首先我們來看一個例子:
我通過 print(a) 讓Python解釋器給我報了一個異常,其中包含錯誤信息的所有上下文信息,代碼路徑、錯誤代碼內(nèi)容、錯誤信息等等。
print(a)這個語句錯誤的原因是在于a這個變量沒有定義 (NameError: name 'a' is not defined),這在我寫代碼之前就清楚。
然而在實際編程過程中,隨著代碼量的增加,我們有的時候并不確定某個變量是否已經(jīng)被賦值成功,如果變量未被成功的賦值,程序還是按原計劃對其進行操作時可能就會直接報錯。
要解決這個問題有兩個辦法:
這兩種辦法的結(jié)果其實都是會告訴用戶錯誤信息,在結(jié)果上并沒有太大的變化,今天我們主要講第二種,異常自動捕獲的方式。
現(xiàn)在我們改造一下剛才的代碼,把異常捕獲到然后自定義處理方式:
以上的代碼例子展示我們通過異常捕獲 try except的語法把錯誤捕獲到,并且自定義了其輸出內(nèi)容。
讓我們來解釋一下這段代碼:
通過在代碼任意位置使用try...except語法,我們可以設(shè)置多個try...except的代碼塊,如果在try中程序正常執(zhí)行沒有報錯,那么程序就會跳過except區(qū)塊,正常執(zhí)行之后的代碼。
異常類型
我們剛才用到Exception這個異常類型,它在Python中是常規(guī)錯誤的基類,如果我們對可能出錯的類型不能確定時就可以使用到它,但是一般不建議這么做。
不直接使用Exception的理由是我們在捕獲到異常時,總是希望能夠?qū)Ξ惓_M行明確的報錯或者處理,如果所有錯誤都是Exception類型,我們其實也不知道程序究竟是在哪里出了錯。
舉個例子來說明這個問題。
通過上面這個例子我們可以學(xué)到兩件事情:
現(xiàn)在我們嘗試把import xxx去掉試試。
現(xiàn)在程序報了類型錯誤(TypeError),因為int類型的數(shù)據(jù)無法和str類型的數(shù)字進行加法操作。
下面我給一個Python的常見異常錯誤類型表,供大家參考。
主動拋出異常
上面我們講到了Python如何被動捕獲異常,現(xiàn)在我們來講講主動拋出異常的方法。
為什么要主動拋出異常?
通常我們通過try except捕獲的異常叫做被動捕獲,它其實是需要程序員進行處理的,比如對錯誤的變量內(nèi)容做一些改正讓其繼續(xù)執(zhí)行。但是主動拋出異常通常不需要再進行處理,程序員已經(jīng)確定這個地方必須拋出異常給用戶,并且中斷程序執(zhí)行,基于這種情況下程序員就不用再對異常進行處理了。
來看一個例子:
在這段代碼里,我們定義了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é)合起來使用:
上面這個例子展現(xiàn)了程序如何主動拋出異常,再由except捕獲并打印錯誤信息。
自定義異常
其實我們剛才了解到所有異常錯誤類型其實都是一個類 (class ),那么我們同樣可以自定義一個異常類,以便于在程序里使用。
通過以上的代碼例子:
總結(jié)
通過自定義異常,我們可以不用拘泥于Python自帶的異常錯誤類型,定義更多自己想要的錯誤類型,精確的控制出錯的時機和處理方式。
最后通過一個思維導(dǎo)圖來展示異常處理的相關(guān)知識點。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流