python 基礎之異常處理

python小胡發表於2018-12-15

異常處理

一、異常處理

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("資訊無誤,可以正常使用")
複製程式碼

相關文章