溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python異常處理的方法實例分析

發(fā)布時間:2022-03-14 11:55:42 來源:億速云 閱讀:165 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python異常處理的方法實例分析的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python異常處理的方法實例分析文章都會有所收獲,下面我們一起來看看吧。

什么是異常與異常處理

異常 —> 可以理解為不同尋常。

正常情況下,我們的程序是自上而下的逐行執(zhí)行,執(zhí)行到最后一行才會終止程序的執(zhí)行。而異常的情況會導(dǎo)致我們的程序半途而廢停止了執(zhí)行。一般情況下的停止執(zhí)行都是因為我們的程序出錯而造成的,而異常就是錯誤,異常的出現(xiàn)會導(dǎo)致我們的程序崩潰并停止運行。這在我們的工作中是非常不友好的!

縱觀程序的一生,都不能保證說程序一定不會出錯。所以當(dāng)遇到錯誤的時候,為了不影響程序的執(zhí)行,我們就需要對這些異常進(jìn)行處理, Python 中的異常機(jī)制,可以監(jiān)控并捕獲到異常。當(dāng)程序出現(xiàn)錯誤的時候?qū)Ξ惓_M(jìn)行臨時妥善的處理,就可以使得程序繼續(xù)正常的運行。

總結(jié):

異常的本質(zhì)就是錯誤

異常的出現(xiàn)會導(dǎo)致程序的崩潰且會停止執(zhí)行

監(jiān)控異常并捕獲,將造成異常的程序進(jìn)行妥善的處理可以使得程序能夠繼續(xù)正常的運行

接下來我們就快快的看一下 究竟如何捕獲異常并進(jìn)行異常處理的語法吧。

異常的語法

try:                   # 異常的關(guān)鍵字,嘗試的意思
    <代碼塊1>               # 被 try 關(guān)鍵字檢查并保護(hù)的業(yè)務(wù)代碼塊
    
except <異常的類型>:         # 發(fā)現(xiàn)異常后的處理關(guān)鍵字,會跟隨一個錯誤類型(異常類型),異常類型可以不填寫
    <代碼塊2>               # try 的代碼塊出現(xiàn)錯誤之后,就會執(zhí)行 except 的代碼塊
                       # 這里一般都是當(dāng) try 代碼塊出現(xiàn)錯誤之后的補(bǔ)救邏輯

來看一個簡單的示例:

1 / 0		# 我們都知道 0 不能被整除,所以產(chǎn)生了下面這樣的報錯

# >>> 執(zhí)行結(jié)果如下
# >>> ZeroDivisionError: division by zero 

# >>> 我們管代碼的報錯叫做 異常的拋出 ,這個報錯信息告訴了我們?yōu)槭裁磮箦e,同時業(yè)務(wù)也會被停止。
# >>> 在程序中,我們是允許出錯的,但是需要對可能遇見的異常捕獲,
# >>> 進(jìn)行合理的處理,讓程序遇到異??梢院侠淼倪\行

看一下針對上文示例的異常進(jìn)行的捕獲

try:
    1 / 0
except:
    print('注意:0 不可以被 1 整除')
    print('ZeroDivisionError: division by zero 已捕獲,程序繼續(xù)執(zhí)行')

# >>> 執(zhí)行結(jié)果如下
# >>> 注意:0 不可以被 1 整除
# >>> ZeroDivisionError: division by zero 已捕獲,程序繼續(xù)執(zhí)行

# >>> 雖然 try 代碼塊拋出了異常,但是我們通過 except 進(jìn)行了合理的規(guī)避,使得我們的程序繼續(xù)向下執(zhí)行

接下來我們再利用我們之前學(xué)到的知識點 upper() 函數(shù)做一個小案例:

定義一個 upper ,利用 upper() 函數(shù) 。將傳入的字符串轉(zhuǎn)為大寫,如傳入?yún)?shù)非 字符串 ,捕獲該異常并處理。

def upper(str_data):
    new_str = None

    try:
        new_str = str_data.upper()
    except:
        print('upper() 函數(shù)轉(zhuǎn)換字符大寫失?。?#39;, '返回結(jié)果為:', new_str)
    return new_str


result = upper('test')
print('傳入?yún)?shù)返回值為:', result)

# >>> 執(zhí)行結(jié)果如下:
# >>> 傳入?yún)?shù)返回值為: TEST


result = upper(1)
print(result)

# >>> 執(zhí)行結(jié)果如下:
# >>> upper() 函數(shù)轉(zhuǎn)換字符大寫失??! 返回結(jié)果為: None

捕獲通用異常

剛剛我們通過 try&hellip;except&hellip; 捕獲了異常并進(jìn)行了合理的處理,但是我們并不知道錯誤的原因是什么。所以我們必須獲取 異常的類型 ,首先我們來學(xué)習(xí)一下如何獲取通用異常類型, 通用異常類型 是我們無法確定是那種異常的情況下使用的一種捕獲方法。

用法如下:

try:
    <代碼塊>
except Exception as e:        # 把通用異常的錯誤原因轉(zhuǎn)換成變量 e , as 為關(guān)鍵字
                            # 也可以理解為 將 Exception 通用異常類型 起一個別名 e
                            # e 變量名可以起任意名字,一般約定成俗都會使用 e 作為異常捕獲的變量名
                            # e 就是 error 的縮寫
    <異常代碼塊>

通用異常捕獲示例如下:

def upper(str_data):
    new_str = None

    try:
        new_str = str_data.upper()
    except Exception as e:
        print('upper() 函數(shù)轉(zhuǎn)換字符大寫失?。?#39;, '返回結(jié)果為:{}'.format(e))
    return new_str


result = upper(1)
print(result)


# >>> 執(zhí)行結(jié)果如下:
# >>> upper() 函數(shù)轉(zhuǎn)換字符大寫失?。?nbsp;返回結(jié)果為:'int' object has no attribute 'upper'

捕獲具體異常

捕獲具體的異常就是我們可以確定在 try 的代碼塊中會出現(xiàn)哪種具體的異常類型,并將其捕獲的方法。語法方面與通用異常一樣,在異常類型區(qū)域書寫 具體的異常類型 就可以了。

我們以上文的 ZeroDivisionError: division by zero 為例

try:
    1 / 0
except ZeroDivisionError as e:		# 書寫指定的異常類型:ZeroDivisionError
    								# ZeroDivisionError 是Python內(nèi)置的具體異常:0不能被整除
    print(e)

# >>> 執(zhí)行結(jié)果如下:
# >>> division by zero

小節(jié):思考一個問題,工作中我們是使用 通用的異常 還是 具體的異常 呢?

從方便的角度來說,使用通用的異常會比較簡單。開發(fā)成本低,不需要關(guān)心具體的異常類型是什么。其實 Exception 也不知知道具體的異常是哪一種類型,它需要去浩瀚的異常庫查找,找到之后進(jìn)行對應(yīng)的拋出,雖然沒有 具體指定異常 處理的那么快,但是這個處理速度也是無感知的。

如果我們能知道 try 代碼塊中 可能出現(xiàn)的具體異常類型,還是希望使用具體的異常類型。這樣可以精準(zhǔn)的對應(yīng)錯誤;

==需要注意的是:當(dāng)我們的 try 代碼塊中,沒有出現(xiàn)我們指定的 具體異常 類型,代碼執(zhí)行依然是會報錯的。==所以各有利弊,可以根據(jù)我們工作中業(yè)務(wù)的具體情況進(jìn)行使用。

如何捕獲多個異常

在我們平時的開發(fā)工作中,很可能在同一個代碼塊中出現(xiàn)多個異常類型。那么我們該如何支持多個異常的捕獲呢?

其實異常的捕獲是非常靈活的,也支持多個異常捕獲的方式。

捕獲多個異常 - 方法1

try:
    result = 1 / 0
except ZeroDivisionError as e1:
    print(e1)
except Exception as e2:            # 可以使用多個 except 來捕獲多個異常
    print('this is a public except , bug is %s' % e2)
    
# >>> 需要注意的是,當(dāng) except 代碼塊中有多個異常的時候,當(dāng)捕獲到第一個異常后,不會在繼續(xù)往下捕獲。

需要注意的是,當(dāng) except 代碼塊中有多個異常的時候,當(dāng)捕獲到第一個異常后,不會在繼續(xù)往下捕獲。

捕獲多個異常 - 方法2

try:
    result = 1 / 0
except (ZeroDivisionError, Exception) as e:        # 在 except 后面的小括號內(nèi)定義多個 異常類型 ,(小括號其實是元組)
                                                # 當(dāng) except 后面使用元組包裹多個 異常類型 時,捕獲到哪種異常類型就拋出哪種
    print(e)

示例如下:

def test():

    try:
        print(name)     # 因為不存在 name 這個變量,所以會拋出一個 NameError: name 'name' is not defined 異常
                        # 嘗試捕獲  NameError 異常
    except (ZeroDivisionError, NameError) as e:
        print(e)
        print(type(e))


test()

# >>> 執(zhí)行結(jié)果如下:
# >>> name 'name' is not defined
# >>> <class 'NameError'>

比較常用的捕獲異常方法是第二種。

關(guān)于“Python異常處理的方法實例分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Python異常處理的方法實例分析”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI