異常處理
一、異常處理
1、異常概念
異常是程式執行力過程中出現的非正常的流程專案。
異常是無法避免的,只能先預估出可能出現的異常現象,並提供對應的處理機制,在異常出現後保障程式不被中斷執行。
複製程式碼
2、異常處理的基本語法
格式一(常用):
try:
可能引發異常現象的程式碼
except:
出現異常現象的處理程式碼
複製程式碼
try:
print(a) # 可能引發異常現象的程式碼
except:
print("變數a未定義") # 出現異常現象的處理程式碼
複製程式碼
格式二(不常用):
try:
可能引發異常現象的程式碼
finally:
try程式碼塊結束後執行的程式碼
複製程式碼
格式三(完整格式):
try:
可能引發異常現象的程式碼
except:
出現異常現象的處理程式碼
else:
未出現異常現象的處理程式碼
finally:
try程式碼塊結束後執行的程式碼
複製程式碼
3、異常精細化處理
異常處理可以根據不同種類的異常進行不同的處理方案設計,使用異常名稱來進行區分。標準格式如下:
except 異常類名1 as 變數名:
出現異常現象的處理程式碼
except 異常類名2 as 變數名:
出現異常現象的處理程式碼
except 異常類名3 as 變數名:
出現異常現象的處理程式碼
except Exception as 變數名:
出現異常現象的處理程式碼
複製程式碼
try:
c = 0
b = a /c
print("b")
except NameError as error: # 通過異常類名後面的變數名可以獲取到具體異常資訊
print("a沒有被定義:"+ str(error))
except ZeroDivisionError as error:
print("被除數不能為零"str(error))
except Exception as error:
print("未知錯誤"str(error))
複製程式碼
上段程式碼執行結果:
a沒有被定義:name 'a' is not defined
複製程式碼
說明:
- 1.通過異常類名後面的變數名可以獲取到具體異常資訊
- 2.執行了某個except中的內容後,其他except中的內容將不再執行
- 3.Exception類是所有異常類的父類,能夠攔截所有的異常現象,通常設定成最後一級的捕獲
4、異常物件主動丟擲
異常物件可以使用主動丟擲的形式來構造,語法格式:
raise 異常物件
複製程式碼
if y == 0:
raise ZeroDivisionError("被除數不能為零")
複製程式碼
5、異常處理傳遞
異常出現後如果沒有被捕獲處理,該異常將會繼續向下傳遞,到下一次呼叫位置。
情況一:使用 try 巢狀處理
"""使用 try 巢狀處理,先處理內層的異常,處理完後再處理外層異常"""
try:
try:
c = 0
b = a /c
print("b")
except NameError as error:
print("a沒有被定義:"+ str(error))
except ZeroDivisionError:
print("被除數不能為零")
except Exception:
print("未知錯誤")
複製程式碼
情況二:函式、/方法呼叫,在任意位置處理
"""最後呼叫處理"""
def oper1():
print( 1 / 0 )
def oper2():
oper1()
def oper3():
oper2()
try:
oper3()
except:
print("處理")
複製程式碼
"""中間呼叫處理"""
def oper1():
print( 1 / 0 )
def oper2():
try:
oper1()
except:
print("處理掉")
def oper3():
oper2()
oper3()
複製程式碼
二、自定義異常
1、自定義異常基本語法
class 自定義異常類名(Exception):
pass
複製程式碼
2、自定義異常主動觸發
raise 異常類物件
複製程式碼
案例:使用者登入資訊校驗
"""
案例:使用者登入資訊校驗
要求:
使用者輸入使用者名稱,密碼後對資訊進行校驗
1.使用者名稱長度在3-8個字元
2.使用者名稱中只能出現英文字母和數字
3.密碼長度必須是6位
4.密碼必須由純數字組成
分析:
1.資訊使用input操作獲取
2.定義自定義異常,描述非法資訊
3.提供檢測的函式,針對情況進行處理
4.執行程式中要使用try結構完成檢測
"""
class NameError(Exception):
pass
class PwdError(Exception):
pass
def login(name,password):
if not 3<= len(name) <= 8:
raise NameError("使用者名稱長度必須在3到8之間")
if not name.isalnum():
raise NameError("使用者名稱必須由字母和數字組成")
if len(password) != 6:
raise PwdError("密碼的長度必須等於6位")
if not password.isnumeric():
raise PwdError("密碼必須由純數字組成")
name = input("請輸入使用者名稱:")
password = input("請輸入密碼:")
try:
login(name, password)
except NameError as error:
print(str(error))
except PwdError as error:
print(str(error))
else:
print("資訊無誤,可以正常使用")
複製程式碼