Python基礎-14異常處理

14.異常處理

    只要是人編寫的代碼,或多或少都會存在一些Bug,當這些Bug被程序捕捉之後,需要怎麼處理,就需要我們告訴代碼應該處理,通常稱之爲異常處理。

14.1 什麼是異常

    Python使用異常對象來表示異常狀態,並在遇到錯誤進引發異常,異常對象被捕捉到未處理,程序則會終止並顯示相應的錯誤信息,經典的異常信息如下所示:

>>> 1/0
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ZeroDivisionError: division by zero

    以上的信息明確告訴我們,除數爲0導致產生異常,但如果只是顯示錯誤信息,沒有太大意義。針對這種需要在代碼中進行捕捉並提供處理方案。

14.2 自定義異常

    可能在代碼中,某些代碼並不會觸發異常,但卻不符合業務邏輯,需要人爲的拋出異常,這時就需要自定義異常了。

14.2.1 raise語句

    使用raise可以引發異常,並將一個類(必須是Exception的子類)或實例做爲參數。如果將類做作爲參數,將自動創建實例。如下所示:

>>> raise Exception
Traceback (most recent call last):
  File "<input>", line 1, in <module>
Exception

>>> raise Exception("i am Exception")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
Exception: i am Exception

    示例一爲通用異常,無法得知具體的異常信息,示例二,自定義了異常的詳細信息,這種方便用戶定位問題。常見的內置異常類如下所示:

140201Python內置異常類.png

14.2.2 自定義異常類

    雖然內置的異常非常多,能滿足大多數的需求,但也有不能滿足的情況下,這時就可以自定義異常類,並添加種類異常類中的方法。通過語法格式如下所示:

class MyException(Exception):
    
    pass

14.3 捕捉異常

    將代碼中可能存在異常的錯誤給抓取到並顯示出來稱爲捕捉異常。針對這種情況,Python提供了try...except...else語句。其基本語法格式如下所示:

try:
   pass
except ErrorType:
   pass
else:
   pass
finally:
   pass

以上的爲最全的一種格式,日常應用else和finally可省略。

14.3.1 try...except:

    這種形式是日常形式使用最多的一種情況,示例代碼如下所示:

def div(x,y):
    try:
        return x/y
    except ZeroDivisionError:
        raise Exception("除數爲0")

14.3.2 多個except語句

    當某一段代碼可能存在多種異常時,可以使用多個except語句,示例代碼如下所示:

def div(x,y):
    try:
        x=int(x)
        y=int(y)
        return x/y
    except ZeroDivisionError:
        print("除數爲0")
    except TypeError:
        print("傳入的參數不是數字")

    如果代碼有很多異常需要處理,需要寫很多個except語句,Python也支持一個except語句捕捉多種異常,可放在元組中實現,如下所示:

def div(x,y):
    try:
        x=int(x)
        y=int(y)
        return x/y
    except (ZeroDivisionError,TypeError,OSError):
        print("程序開小差啦。。。。")

14.3.3 捕捉對象

    要在except子句中訪問異常對象本身,雖然可以使用元組傳遞參數,但參數也只有一個。而如果需要將其對應的詳細錯誤信息打印出來可以使用以下這種形式:

def div(x,y):
    try:
        x=int(x)
        y=int(y)
        return x/y
    except (ZeroDivisionError,TypeError,OSError) as ex:
        print(f"程序開小差啦。。。。\n{ex}")

    上述代碼中,except可以捕捉3種異常,但因同時顯式捕捉了對象本身,因此可以將其詳細錯誤打印出來,方便代碼調試和維護。

14.4.4 try...except...else

    在某些情況下,在沒出現異常時,希望繼續下一個代碼塊。則可以像for...else一樣,使用try...except...else。示例代碼如下所示:

def sub(x,y):
    try:
        x=int(x)
        y=int(y)
    except Exception as ex:
        print(f"捕捉到異常\n{ex}")
    else:
        return x-y

    以上代碼,當x,y被轉換爲整型數據沒有出現異常時,則運行else中的代碼塊。

14.4.5 try...finally

    無語是否發生異常,在程序結束前,均執行finally中的語句。示例代碼如下所示:

def sub(x,y):
    try:
        x=int(x)
        y=int(y)
    except Exception as ex:
        print(f"捕捉到異常\n{ex}")
    else:
        print(f"程序運行結果爲:{x-y}")
    finally:
        print("無論程序是否有異常,都需要運行我")

    Python中的異常處理並不太很難,在平時的實踐過程,應該在可能出現異常的代碼添加異常處理,方便調試、排錯和代碼定位。

本文地址:https://www.cnblogs.com/surpassme/p/13020566.html
本文同步在微信訂閱號上發佈,如各位小夥伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼添加關注:
MyQRCode.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章