網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、引言
有一定 Python 編程經(jīng)驗(yàn)的人估計(jì)十有八九使用過(guò)異常,異常對(duì)于程序的健壯性是毋庸置疑的。
二、使用異常對(duì)數(shù)據(jù)進(jìn)行初始化
在某些條件下,需要進(jìn)行數(shù)據(jù)初始化,但數(shù)據(jù)不能提前確認(rèn),這個(gè)時(shí)候就可以結(jié)合異常的使用來(lái)判斷是否需要進(jìn)行初始化。下面的代碼中的函數(shù) listDataStatics 用于統(tǒng)計(jì)列表中每個(gè)元素的出現(xiàn)個(gè)數(shù),處理時(shí)循環(huán)遍歷列表,對(duì)列表中已經(jīng)存在的元素計(jì)數(shù)器加 1,否則如果是鍵值不存在異常則進(jìn)行數(shù)據(jù)初始化:
def listDataStatics(infList): dataInf = {} for l in infList: try: dataInf[l] += 1 except KeyError as e: dataInf[l] =1 return dataInf
當(dāng)然上述過(guò)程也可以用列表的 index 等方法來(lái)實(shí)現(xiàn),但個(gè)人認(rèn)為這種方式最簡(jiǎn)單。
三、使用異常實(shí)現(xiàn)重處理
某些異常需要進(jìn)行重處理,如出現(xiàn)網(wǎng)絡(luò)連接斷開(kāi)時(shí)需要在網(wǎng)絡(luò)正常后重新訪(fǎng)問(wèn)網(wǎng)絡(luò),下面是一個(gè)案例。
import urllib,time def getHtmlPage(url): while True: try: req = urllib.request.Request(url=url) text = urllib.request.urlopen(req).read().decode() except ConnectionError: print("ConnectionError:network has disconnected") time.sleep(3) continue except Exception as e: err = str(e) if err.find('getaddrinfo failed')>=0: print("getaddrinfo failed:network has disconnected") time.sleep(3) continue else: return '' else:return text
四、使用異常應(yīng)對(duì)多種潛在情況
在使用 Moviepy1.03 通過(guò) VideoFileClip 執(zhí)行報(bào) UnicodeDecodeError 錯(cuò),發(fā)現(xiàn)是少數(shù)視頻有問(wèn)題,從報(bào)錯(cuò)信息看是 Moviepy 的 ffmpeg_reader.py 模塊有個(gè)如下代碼:infos = error.decode(‘utf8’)
解碼出現(xiàn)問(wèn)題,將其改為:infos = error.decode(‘ANSI’)
順利解決,但解決后用來(lái)加載其他視頻文件又報(bào)錯(cuò),后來(lái)將代碼改成如下方式:
try: infos = error.decode('utf8') except Exception as e: infos = error.decode('ANSI')
五、獲取異常詳細(xì)信息
Python 自己拋出的異常會(huì)有詳細(xì)的異常信息,包括異常類(lèi)型、錯(cuò)誤內(nèi)容、程序代碼位置及相關(guān)函數(shù)調(diào)用棧信息,但異常捕獲后這些錯(cuò)誤信息默認(rèn)就消失了,為了實(shí)現(xiàn)提供與 Python 相同的異常信息,需要異常捕獲程序進(jìn)行處理:
通過(guò)類(lèi)似except Exception as e
捕獲異常后,打印 e 的內(nèi)容(也可打印 e.errno、e.strerror)可以提供異常的類(lèi)型及異常的錯(cuò)誤信息說(shuō)明;
采用 traceback 模塊的 print_exc 查看異常對(duì)應(yīng)程序代碼位置及相關(guān)函數(shù)調(diào)用棧信息發(fā)生異常時(shí),Python 保留引發(fā)異常程序的當(dāng)前狀態(tài),并可通過(guò) traceback 跟蹤異常發(fā)生時(shí)與函數(shù)調(diào)用堆棧有關(guān)的信息。程序調(diào)用每個(gè)函數(shù)時(shí),Python 會(huì)在“函數(shù)調(diào)用堆棧”的起始處插入函數(shù)名。一旦異常被引發(fā),Python 會(huì)搜索異常處理程序,如果當(dāng)前函數(shù)中沒(méi)有異常處理程序,當(dāng)前函數(shù)會(huì)終止執(zhí)行,Python 會(huì)搜索當(dāng)前函數(shù)的調(diào)用函數(shù),并以此類(lèi)推,直到發(fā)現(xiàn)匹配的異常處理程序,或者 Python 抵達(dá)主程序?yàn)橹埂_@一查找合適的異常處理程序的過(guò)程就稱(chēng)為“堆棧輾轉(zhuǎn)開(kāi)解”(StackUnwinding)。
下面代碼在訪(fǎng)問(wèn)網(wǎng)站遇到異常時(shí),打印詳細(xì)的異常錯(cuò)誤信息及代碼位置:
import urllib,traceback def getHtmlPage(url): try: req = urllib.request.Request(url=url) text = urllib.request.urlopen(req).read().decode() except Exception as e: print(f"訪(fǎng)問(wèn)網(wǎng)站獲取推薦文章失敗,當(dāng)前url={url},異常原因:\n{e}\n" + '\n' + traceback.format_exc() ) return '' else:return text
六、人工觸發(fā)異常
除了程序自動(dòng)引發(fā)的異常外,也可以通過(guò) raise 函數(shù)主動(dòng)拋出異常,一般用在程序主動(dòng)檢查發(fā)現(xiàn)錯(cuò)誤的情況,避免錯(cuò)誤擴(kuò)散。下面這段代碼檢查列表 infList 中的元素是否為列表,如果不是列表則拋出異常:
for row in infList: if not isinstance(row,list): raise ValueError("checkAndRepairListData實(shí)參不滿(mǎn)足第一個(gè)參數(shù)為二維列表的要求!\n"+traceback.format_exc())
可以看到,使用 raise 拋出異常時(shí),需要提供異常類(lèi)型和異常信息,并在此時(shí)也可以獲取程序的代碼位置及函數(shù)堆棧信息。
七、異常嵌套
異常允許嵌套,包括在一個(gè) try...except 語(yǔ)句的 try 和 except 之間嵌入另一個(gè) try...except 語(yǔ)句,也可以在異常處理語(yǔ)句、else、finally 子句中再嵌套 try...except 語(yǔ)句,在此就不舉例介紹了。
小結(jié)
本文介紹了 Python 異常用于數(shù)據(jù)初始化、業(yè)務(wù)重處理、多情況處理的三種應(yīng)用方式,以及獲取異常詳細(xì)信息、人工觸發(fā)異常及異常嵌套等與異常相關(guān)的知識(shí)
原文鏈接:https://blog.csdn.net/BROKEN__Y/article/details/128104376
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-10-26 Jira?任務(wù)管理系統(tǒng)項(xiàng)目總結(jié)講解_React
- 2022-10-27 Python使用pandas將表格數(shù)據(jù)進(jìn)行處理_python
- 2022-09-02 六個(gè)Python編程最受用的內(nèi)置函數(shù)使用詳解_python
- 2023-07-25 使用線(xiàn)程池異步執(zhí)行定時(shí)任務(wù)
- 2022-04-16 PyCharm實(shí)現(xiàn)本地恢復(fù)或查看歷史代碼_python
- 2023-05-31 Pandas提取含有指定字符串的行(完全匹配,部分匹配)_python
- 2022-09-17 Python?seaborn數(shù)據(jù)可視化繪圖(直方圖,密度圖,散點(diǎn)圖)_python
- 2023-07-28 select 框添加樹(shù)結(jié)構(gòu)(todu)
- 欄目分類(lèi)
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支