日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python常見異常的處理方式淺析_python

作者:愛吃餅干的小白鼠 ? 更新時間: 2023-05-29 編程語言

一、引言

有一定 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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新