更多詳情請點擊查看原文:Python教學(xué) | 有備無患!詳解 Python 異常處理(try-except)
Python教學(xué)專欄,旨在為初學(xué)者提供系統(tǒng)、全面的Python編程學(xué)習(xí)體驗。通過逐步講解Python基礎(chǔ)語言和編程邏輯,結(jié)合實操案例,讓小白也能輕松搞懂Python!
>>>點擊此處查看往期Python教學(xué)內(nèi)容
本文目錄
引言
一、關(guān)于異常
二、try-except 用法
三、哪些情況下需要使用 try-except ?
? 1. 使用易報錯函數(shù)時
? 2. 使用網(wǎng)絡(luò)請求數(shù)據(jù)時
? 3. 分批處理大數(shù)據(jù)集時
? 4. ……
四、異常處理注意事項
總結(jié)
相關(guān)推薦
本文共5707個字,閱讀大約需要15分鐘,歡迎指正!
引言
無論是數(shù)據(jù)清洗、轉(zhuǎn)換還是分析,我們都需要確保程序能夠穩(wěn)定地運行,避免數(shù)據(jù)處理過程中的意外中斷。使用 Python 處理大數(shù)據(jù)集或執(zhí)行循環(huán)程序時,程序異??赡軙o我們帶來一系列的麻煩,而 Python 解釋器一旦遇到異常,就會立即中斷程序,其中的原因包括但不限于文件不存在、網(wǎng)絡(luò)連接中斷、數(shù)據(jù)格式錯誤、數(shù)據(jù)內(nèi)部問題等。
如果我們不希望個別小問題影響整個程序的正常運行,那么就可以使用 Python 的異常處理語句:try-except
?。它能夠幫助我們略過程序的異常部分或者針對不同類型的異常采取不同的應(yīng)對措施,保障程序不被未知異常中斷。
一、關(guān)于異常
異常是我們常說的“報錯”,宏觀上分為兩類,一類是語法錯誤(SyntaxError),另一類是程序異常(Exception)。無論是語法錯誤還是程序異常,只要觸發(fā),程序就會立刻停止運行。
針對程序異常來說,又分為多種異常,數(shù)據(jù)處理中常見的異常有以下幾種:
-
KeyError(鍵錯誤):當(dāng)試圖訪問字典中不存在的鍵時引發(fā)的異常。
-
ValueError(值錯誤):當(dāng)傳遞給函數(shù)的參數(shù)類型正確但值不合法時引發(fā)的異常。
-
TypeError(類型錯誤):當(dāng)使用不兼容的類型進行操作或函數(shù)調(diào)用時引發(fā)的異常。
-
FileNotFoundError(文件未找到錯誤):當(dāng)試圖打開不存在的文件時引發(fā)的異常。
-
IndexError(索引錯誤):當(dāng)使用無效的索引訪問序列(如列表、元組或字符串)時引發(fā)的異常。
-
OverflowError(溢出錯誤):當(dāng)數(shù)值運算結(jié)果超出了所能表示的范圍時引發(fā)的異常。
-
AttributeError(屬性錯誤):當(dāng)試圖訪問對象不存在的屬性時引發(fā)的異常。
-
UnicodeError(Unicode 錯誤):當(dāng)處理字符串時遇到 Unicode 編碼相關(guān)的錯誤時引發(fā)的異常。
-
IOError(輸入輸出錯誤):當(dāng)發(fā)生與輸入輸出相關(guān)的錯誤時引發(fā)的異常,如讀取或?qū)懭胛募 ?/p>
二、try-except 用法
try-except
是一個組合語句,書寫格式類似于if-else
語句,但又有很大的不同。if
關(guān)鍵字可以單獨出現(xiàn),代表單分支結(jié)構(gòu),但try
與except
必須一起使用,缺一不可。try-except
的基本結(jié)構(gòu)如下:
try:
????<代碼塊1>
except:
????<代碼塊2>
上述結(jié)構(gòu)中,<代碼塊1>
中一般是一些容易“報錯”的代碼,如果<代碼塊1>
中的代碼能夠正常運行,那么程序就會逃過<代碼塊2>
去執(zhí)行后續(xù)的其他代碼;而<代碼塊2>
中的代碼一般是<代碼塊1>
報錯時的應(yīng)對措施。總的來說,如果<代碼塊1>
能正常運行,那么皆大歡喜;但如果<代碼塊1>
中的代碼出現(xiàn)異常,那么程序就會執(zhí)行<代碼塊2>
中的代碼,而不是直接報錯和終止程序。(如果<代碼塊2>
中的代碼是 pass,則代表忽略這個異常。)
以上是try-except
語句的基本結(jié)構(gòu),也是最常用的結(jié)構(gòu),簡單粗暴易懂。但當(dāng)程序變得復(fù)雜時,可能就需要更加精準地針對不同類型的異常實施不同的解決方案,這種更復(fù)雜的異常處理結(jié)構(gòu)如下:
try:
????<代碼塊1>
except?異常類型1:
????<代碼塊2>
except?異常類型2:
????<代碼塊3>
except?異常類型3:
????<代碼塊4>
????……
except?Exception:
????<代碼塊N>
這種結(jié)構(gòu)可以對指定的異常類型分配不同的處理方式,當(dāng)<代碼塊1>
中出現(xiàn)異常類型1
時,程序就會執(zhí)行<代碼塊2>
,當(dāng)<代碼塊1>
中出現(xiàn)異常類型2
時,程序就會執(zhí)行<代碼塊3>
……如果拋出的異常類型不屬于任何一種已寫明的異常,那么都會被歸入異常類基類 Exception 中,進而執(zhí)行<代碼塊N>
。
除此之外,try-except
還有一些其他結(jié)果,包括try-except-else
、try-except-else-finally
。這些結(jié)果能夠?qū)崿F(xiàn)更多異常處理功能,讓代碼結(jié)構(gòu)更加清晰,但筆者認為上述兩種結(jié)果已經(jīng)足夠幫助我們解決 99% 的實際問題了,所以本文就不再對這兩種結(jié)構(gòu)多做介紹。
三、哪些情況下需要使用 try-except ?
1. 使用易報錯函數(shù)時
在使用 OCR 技術(shù)識別表格時,得到的表格中,每個單元格中的值都是字符串,因我們需要將存放數(shù)值的單元格內(nèi)容轉(zhuǎn)為數(shù)字類型,這就要用到 Python 內(nèi)置函數(shù) eval()。但是 OCR 識別結(jié)果可能會出現(xiàn)少許錯誤,例如原始數(shù)據(jù)中的數(shù)字 “3.15” 被識別為 “3·15”,那么這個數(shù)字就無法被 eval() 函數(shù)轉(zhuǎn)為數(shù)字,進而拋出異常(eval 函數(shù)遇到無法轉(zhuǎn)換的字符時會直接報錯而不是返回其他值)。如果我們在轉(zhuǎn)換類型時不希望個別異常數(shù)據(jù)打斷程序的正常運行,那么我們就可以編寫一個函數(shù)來進行轉(zhuǎn)換,這個函數(shù)的功能是,如果輸入的字符串可以被轉(zhuǎn)為數(shù)字,那么就返回轉(zhuǎn)化結(jié)果,如果不可以被轉(zhuǎn)換,那么就輸出提示性文字并返回特殊標記,后續(xù)再人工核查。
def?try_eval(Str):
????try:
????????#?嘗試直接返回轉(zhuǎn)換后的值
????????return?eval(Str)
????except:
????????#?若無法正常轉(zhuǎn)換,輸出提示文字并返回特殊標記
????????print(f'輸入值【{Str}】無法被正常轉(zhuǎn)換')
????????return?'--'
因此在應(yīng)用轉(zhuǎn)換函數(shù)時使用優(yōu)化后的函數(shù),就可以避免程序頻繁報錯。
2. 使用網(wǎng)絡(luò)請求數(shù)據(jù)時
很多時候我們需要使用 Python 從網(wǎng)站或服務(wù)器中獲取數(shù)據(jù),例如在采集數(shù)據(jù)或調(diào)用網(wǎng)絡(luò)服務(wù) API 時。筆者在使用高德地圖或者百度地圖的地理服務(wù) API 時,請求數(shù)據(jù)的函數(shù)中一般都會使用多層try-except
?來規(guī)避程序報錯。
def?revfunc(df):
????lng?=?df['LNG1']
????lat?=?df['LAT1']
????if?lng?!=?'':
????????#?若?經(jīng)緯度?不為空
????????GD_inv?=?GD.regeocode_by_lonlat(lng,?lat)
????????try:
????????????#?若返回狀態(tài)正常
????????????if?GD_inv['status']?==?'1'
????????????????try:
????????????????????#?根據(jù)經(jīng)緯度返回省份、地市、區(qū)縣、行政區(qū)劃代碼
????????????????????return?GD_inv['regeocode']['addressComponent']['province'],\
???????????????????????????GD_inv['regeocode']['addressComponent']['city'],\
???????????????????????????GD_inv['regeocode']['addressComponent']['district'],\
???????????????????????????GD_inv['regeocode']['addressComponent']['adcode']
????????????????except:
????????????????????return?'','','',''
????????????else:
????????????????return?'','','',''
????????except:
????????????return?'','','',''
????else:
????????#?若?經(jīng)緯度?為空
????????return?'','','',''
因為這些程序在運行時不僅需要穩(wěn)定的網(wǎng)絡(luò)環(huán)境,還對輸入值有著較為嚴格的要求,所以出現(xiàn)異常的幾率非常之高。因此我們可以使用異常處理結(jié)構(gòu)增加程序穩(wěn)定性。
3. 分批處理大數(shù)據(jù)集時
使用 Python 大數(shù)據(jù)集時,由于計算機(運行)內(nèi)存空間不足以裝載整個數(shù)據(jù)集,往往需要分批處理,將數(shù)據(jù)集分成 N 個數(shù)據(jù)塊,每次處理一塊數(shù)據(jù)。如果數(shù)據(jù)集非常大,同時處理步驟也比較復(fù)雜,那么整個程序可能要持續(xù)運行數(shù)個小時,這就對程序的穩(wěn)定性有著非常高的要求。如果某個數(shù)據(jù)塊中出現(xiàn)異常數(shù)據(jù)導(dǎo)致程序中斷,我們可能不會立即察覺,后續(xù)要重新啟動程序,費時費力。在這種情況下,也建議大家使用異常處理結(jié)構(gòu),防止異常造成程序中斷。當(dāng)然,在此情況下我們還需要做好異常應(yīng)對策略,不能完全忽略異常的發(fā)生,因為這很可能讓我們丟失數(shù)據(jù)。
4. ……
如果您覺得數(shù)據(jù)處理時還有某些場景比較依賴try-except
,歡迎在留言區(qū)留言分享。
四、異常處理注意事項
在使用try-except
語句時,不能在所有情況下都使用忽略異常這個思路。尤其是在分批處理大數(shù)據(jù)集時,如果一個數(shù)據(jù)塊在被處理時發(fā)生異常,盡管其有著異常處理的代碼,但最終這個數(shù)據(jù)塊可能還是沒有被成功處理。所以我們一定要在except
語句下編寫合適的應(yīng)對代碼,例如遇到無法處理的數(shù)據(jù)塊時,先將其單獨保存下來,待大部分數(shù)據(jù)處理完成后,再對這些問題數(shù)據(jù)進行單獨操作。
不僅如此,有些時候我們還需要記錄詳細的報錯信息,并使用日志庫將其記錄下來,事后分析異常原因,防止后續(xù)再次踩坑。
總結(jié)
??Python的異常處理語句try-except
提供了一種有效的方式來處理代碼中可能出現(xiàn)的異常情況。通過正確地使用try-except
,我們可以提高代碼的健壯性和可靠性,避免程序崩潰,并且更好地掌控程序流程。同時,我們也應(yīng)該注意異常處理的細節(jié)和注意事項,以保證我們的代碼在出現(xiàn)異常時能夠正確地響應(yīng)和處理。
如果你想學(xué)習(xí)各種 Python 編程技巧,提升個人競爭力,那就加入我們的數(shù)據(jù) Seminar 交流群吧,歡迎大家在社群內(nèi)交流、探索、學(xué)習(xí),一起進步!同時您也可以分享通過數(shù)據(jù) Seminar 學(xué)到的技能以及得到的成果。
相關(guān)推薦
Python 教學(xué)
-
Python 教學(xué) | 學(xué)習(xí) Python 第一步——環(huán)境安裝與配置
-
Python 教學(xué) | Python 基本數(shù)據(jù)類型
-
Python 教學(xué) | Python 字符串操作(上)
-
Python 教學(xué) | Python 字符串操作(下)
-
Python 教學(xué) | Python 變量與基本運算
-
Python 教學(xué) | 組合數(shù)據(jù)類型-列表
-
Python 教學(xué) | 組合數(shù)據(jù)類型-集合(內(nèi)含實例)
-
Python 教學(xué) | 組合數(shù)據(jù)類型 - 字典&元組
-
Python 教學(xué) | Python 中的分支結(jié)構(gòu)(判斷語句)
-
Python 教學(xué) | Python 中的循環(huán)結(jié)構(gòu)(上)
-
Python 教學(xué) | Python 中的循環(huán)結(jié)構(gòu)(下)
-
Python 教學(xué) | Python 函數(shù)的定義與調(diào)用
-
Python 教學(xué) | Python 內(nèi)置函數(shù)
-
Python 教學(xué) | 最常用的標準庫之一 —— os
-
Python 教學(xué) | 盤點 Python 數(shù)據(jù)處理常用標準庫
-
Python 教學(xué) | “小白”友好型正則表達式教學(xué)(一)
-
Python 教學(xué) | “小白”友好型正則表達式教學(xué)(二)
-
Python 教學(xué) | “小白”友好型正則表達式教學(xué)(三)
-
Python 教學(xué) | 數(shù)據(jù)處理必備工具之 Pandas(基礎(chǔ)篇)
-
Python 教學(xué) | 數(shù)據(jù)處理必備工具之 Pandas(數(shù)據(jù)的讀取與導(dǎo)出)
-
Python 教學(xué) | Pandas 數(shù)據(jù)索引與數(shù)據(jù)選取
-
Python 教學(xué) | Pandas 妙不可言的條件數(shù)據(jù)篩選
-
Python 教學(xué) | Pandas 缺失值與重復(fù)值的處理方法
-
Python 教學(xué) | Pandas 表格數(shù)據(jù)行列變換
-
Python 教學(xué) | Pandas 表格字段類型精講(含類型轉(zhuǎn)換)
-
Python 教學(xué) | Pandas 數(shù)據(jù)合并(含目錄文件合并案例)
-
Python 教學(xué) | Pandas 數(shù)據(jù)匹配(含實操案例)
-
Python 教學(xué) | Pandas 函數(shù)應(yīng)用(apply/map)【上】
-
Python 教學(xué) | Pandas 函數(shù)應(yīng)用(apply/map)【下】
-
Python 教學(xué) | Pandas 分組聚合與數(shù)據(jù)排序
-
Python 教學(xué) | Pandas 時間數(shù)據(jù)處理方法
-
Python 教學(xué) | 列表推導(dǎo)式 & 字典推導(dǎo)式
-
Python 教學(xué) | 一文搞懂面向?qū)ο笾械摹邦惡蛯嵗?/p>
-
Python 教學(xué) | Python 學(xué)習(xí)路線+經(jīng)驗分享,新手必看!
-
Python 教學(xué) | 解密 Windows 中的 Path 環(huán)境變量
Python實戰(zhàn)
-
Python實戰(zhàn) | 如何使用 Python 調(diào)用 API
-
Python 實戰(zhàn) | 使用正則表達式從文本中提取指標
-
大數(shù)據(jù)分析 | 用 Python 做文本詞頻分析
-
數(shù)據(jù)治理 | 從“今天中午吃什么”中學(xué)習(xí)Python文本相似度計算
-
數(shù)據(jù)治理 | 省下一個億!一文讀懂如何用python讀取并處理PDF中的表格(贈送本文所用的PDF文件)
-
數(shù)據(jù)治理 | 還在人工識別表格呢?Python 調(diào)用百度 OCR API 又快又準
-
數(shù)據(jù)治理 | 如何用 Python 批量壓縮/解壓縮文件
-
案例分享:使用 Python 批量處理統(tǒng)計年鑒數(shù)據(jù)(上)
-
案例分享:使用 Python 批量處理統(tǒng)計年鑒數(shù)據(jù)(下)
-
Python 實戰(zhàn) | ChatGPT + Python 實現(xiàn)全自動數(shù)據(jù)處理/可視化
-
ChatGPT在指尖跳舞: open-interpreter實現(xiàn)本地數(shù)據(jù)采集、處理一條龍
-
Python 實戰(zhàn) | 文本分析之文本關(guān)鍵詞提取
-
Python 實戰(zhàn) | 文本分析工具之HanLP入門
-
Python 實戰(zhàn) | 進階中文分詞之 HanLP 詞典分詞(上)
-
Python 實戰(zhàn) | 進階中文分詞之 HanLP 詞典分詞(下)
-
Python實戰(zhàn) | 文本文件編碼問題的 Python 解決方案
- Python 實戰(zhàn) | 從 PDF 中提?。蚓€不全的)表格
數(shù)據(jù)可視化
-
數(shù)據(jù)可視化 | 講究!用 Python 制作詞云圖學(xué)問多著呢
-
數(shù)據(jù)可視化 | 地址數(shù)據(jù)可視化—教你如何繪制地理散點圖和熱力圖
-
數(shù)據(jù)可視化 | 太酷了!用 Python 繪制3D地理分布圖
-
數(shù)據(jù)可視化 | 用 Python 制作動感十足的動態(tài)柱狀圖
-
數(shù)據(jù)可視化 | Python繪制多維柱狀圖:一圖展示西部各省人口變遷【附本文數(shù)據(jù)和代碼】文章來源:http://www.zghlxwxcb.cn/news/detail-856596.html
-
數(shù)據(jù)可視化 | 3D 柱狀圖一覽各省農(nóng)民合作社存量近十年變化文章來源地址http://www.zghlxwxcb.cn/news/detail-856596.html
到了這里,關(guān)于Python教學(xué) | 有備無患!詳解 Python 異常處理(try-except)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!