您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python常見異常的處理方式是什么”,在日常操作中,相信很多人在Python常見異常的處理方式是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python常見異常的處理方式是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
有一定 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常見異常的處理方式是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。