網站首頁 編程語言 正文
一、引言
有一定 Python 編程經驗的人估計十有八九使用過異常,異常對于程序的健壯性是毋庸置疑的。
二、使用異常對數據進行初始化
在某些條件下,需要進行數據初始化,但數據不能提前確認,這個時候就可以結合異常的使用來判斷是否需要進行初始化。下面的代碼中的函數 listDataStatics 用于統計列表中每個元素的出現個數,處理時循環遍歷列表,對列表中已經存在的元素計數器加 1,否則如果是鍵值不存在異常則進行數據初始化:
def listDataStatics(infList): dataInf = {} for l in infList: try: dataInf[l] += 1 except KeyError as e: dataInf[l] =1 return dataInf
當然上述過程也可以用列表的 index 等方法來實現,但個人認為這種方式最簡單。
三、使用異常實現重處理
某些異常需要進行重處理,如出現網絡連接斷開時需要在網絡正常后重新訪問網絡,下面是一個案例。
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
四、使用異常應對多種潛在情況
在使用 Moviepy1.03 通過 VideoFileClip 執行報 UnicodeDecodeError 錯,發現是少數視頻有問題,從報錯信息看是 Moviepy 的 ffmpeg_reader.py 模塊有個如下代碼:infos = error.decode(‘utf8’)
解碼出現問題,將其改為:infos = error.decode(‘ANSI’)
順利解決,但解決后用來加載其他視頻文件又報錯,后來將代碼改成如下方式:
try: infos = error.decode('utf8') except Exception as e: infos = error.decode('ANSI')
五、獲取異常詳細信息
Python 自己拋出的異常會有詳細的異常信息,包括異常類型、錯誤內容、程序代碼位置及相關函數調用棧信息,但異常捕獲后這些錯誤信息默認就消失了,為了實現提供與 Python 相同的異常信息,需要異常捕獲程序進行處理:
通過類似except Exception as e
捕獲異常后,打印 e 的內容(也可打印 e.errno、e.strerror)可以提供異常的類型及異常的錯誤信息說明;
采用 traceback 模塊的 print_exc 查看異常對應程序代碼位置及相關函數調用棧信息發生異常時,Python 保留引發異常程序的當前狀態,并可通過 traceback 跟蹤異常發生時與函數調用堆棧有關的信息。程序調用每個函數時,Python 會在“函數調用堆棧”的起始處插入函數名。一旦異常被引發,Python 會搜索異常處理程序,如果當前函數中沒有異常處理程序,當前函數會終止執行,Python 會搜索當前函數的調用函數,并以此類推,直到發現匹配的異常處理程序,或者 Python 抵達主程序為止。這一查找合適的異常處理程序的過程就稱為“堆棧輾轉開解”(StackUnwinding)。
下面代碼在訪問網站遇到異常時,打印詳細的異常錯誤信息及代碼位置:
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"訪問網站獲取推薦文章失敗,當前url={url},異常原因:\n{e}\n" + '\n' + traceback.format_exc() ) return '' else:return text
六、人工觸發異常
除了程序自動引發的異常外,也可以通過 raise 函數主動拋出異常,一般用在程序主動檢查發現錯誤的情況,避免錯誤擴散。下面這段代碼檢查列表 infList 中的元素是否為列表,如果不是列表則拋出異常:
for row in infList: if not isinstance(row,list): raise ValueError("checkAndRepairListData實參不滿足第一個參數為二維列表的要求!\n"+traceback.format_exc())
可以看到,使用 raise 拋出異常時,需要提供異常類型和異常信息,并在此時也可以獲取程序的代碼位置及函數堆棧信息。
七、異常嵌套
異常允許嵌套,包括在一個 try...except 語句的 try 和 except 之間嵌入另一個 try...except 語句,也可以在異常處理語句、else、finally 子句中再嵌套 try...except 語句,在此就不舉例介紹了。
小結
本文介紹了 Python 異常用于數據初始化、業務重處理、多情況處理的三種應用方式,以及獲取異常詳細信息、人工觸發異常及異常嵌套等與異常相關的知識
原文鏈接:https://blog.csdn.net/BROKEN__Y/article/details/128104376
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-04-06 C/C++程序鏈接與反匯編工具objdump的使用介紹_C 語言
- 2022-04-20 Xamarin渲染器移植到.NET?MAUI項目中_實用技巧
- 2023-02-05 詳解Golang中Context的三個常見應用場景_Golang
- 2022-12-04 Python學習之字典和集合的使用詳解_python
- 2022-11-29 python中的import、from?import及import?as的區別解析_python
- 2023-01-07 Python個人博客程序開發實例后臺編寫_python
- 2022-06-17 Go語言使用Request,Response處理web頁面請求_Golang
- 2022-03-14 surface屏幕自動調節亮度無法關閉
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支