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
? ? 示例一為通用例外,無法得知具體的例外資訊,示例二,自定義了例外的詳細資訊,這種方便用戶定位問題,常見的內置例外類如下所示:

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,或掃描下面的二維碼添加關注:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141168.html
標籤:Python
