異常是程序執行力過程當中出現的非正常的流程項目。
異常是沒法避免的,只能先預估出可能出現的異常現象,並提供對應的處理機制,在異常出現後保障程序不被中斷執行。
複製代碼
格式一(經常使用):python
try:
可能引起異常現象的代碼
except:
出現異常現象的處理代碼
複製代碼
try:
print(a) # 可能引起異常現象的代碼
except:
print("變量a未定義") # 出現異常現象的處理代碼
複製代碼
格式二(不經常使用):函數
try:
可能引起異常現象的代碼
finally:
try代碼塊結束後運行的代碼
複製代碼
格式三(完整格式):spa
try:
可能引起異常現象的代碼
except:
出現異常現象的處理代碼
else:
未出現異常現象的處理代碼
finally:
try代碼塊結束後運行的代碼
複製代碼
異常處理能夠根據不一樣種類的異常進行不一樣的處理方案設計,使用異常名稱來進行區分。標準格式以下:
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
複製代碼
說明:code
異常對象可使用主動拋出的形式來構造,語法格式:對象
raise 異常對象
複製代碼
if y == 0:
raise ZeroDivisionError("被除數不能爲零")
複製代碼
異常出現後若是沒有被捕獲處理,該異常將會繼續向下傳遞,到下一次調用位置。input
狀況一:使用 try 嵌套處理string
"""使用 try 嵌套處理,先處理內層的異常,處理完後再處理外層異常"""
try:
try:
c = 0
b = a /c
print("b")
except NameError as error:
print("a沒有被定義:"+ str(error))
except ZeroDivisionError:
print("被除數不能爲零")
except Exception:
print("未知錯誤")
複製代碼
狀況二:函數、/方法調用,在任意位置處理it
"""最後調用處理"""
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()
複製代碼
class 自定義異常類名(Exception):
pass
複製代碼
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("信息無誤,能夠正常使用")
複製代碼