瞭解python 異常處理,捕獲未知異常以及自定義異常

Python3 錯誤和異常

沒有異常處理機制

當我們敲代碼時,總時會出現一些語法錯誤,執行時就會報錯,提示我們是什麼類型的錯誤。這時我們就要去修改錯誤,直到沒有語法錯誤,程序就不會報錯(邏輯錯誤是不會報錯的,邏輯錯誤就是程序執行結果與要達到的要求不同)
Value Error:值錯誤
在這裏插入圖片描述
ZeroDivisionError:除零錯誤在這裏插入圖片描述

更多異常點擊:等等這些錯誤

異常處理器 except

except 子句指定一個或多個異常處理器。 當 try 子句中沒有發生異常時,沒有異常處理器會被執行。 當 try 子句中發生異常時,將啓動對異常處理器的搜索。 此搜索會依次檢查 except 子句,直至找到與該異常相匹配的子句。 如果存在無表達式的 except 子句,它必須是最後一個;它將匹配任何異常。

代碼示例

捕獲錯誤類型

如果我們能夠預知這些代碼可能會出現什麼樣的錯誤,我們就可以直接捕獲。

在這裏插入圖片描述


try:
    # 提示用戶輸入一個整數
    num = int(input("請輸入一個整數:"))

    # 使用 8 初一用戶輸入的整數並且輸出
    result = 8 / num
    print(result)

except ZeroDivisionError:
    print("除零錯誤")

except ValueError:
    print("請輸入正確的整數")

except:
    print("其他錯誤")

但是我們有時候考慮不了那麼全面,所以需要捕獲未知的錯誤

捕獲未知錯誤

try:
    # 提示用戶輸入一個整數
    num = int(input("請輸入一個整數:"))

    # 使用 8 初一用戶輸入的整數並且輸出
    result = 8 / num

    print(result)

# except ZeroDivisionError:
#     print("除零錯誤")

except ValueError:
    print("請輸入正確的整數")

except Exception as result:
    print("未知錯誤 %s " % result)

使用
except Exception as result:
print("未知錯誤 %s " % result)
這種格式,就能夠捕獲未知錯誤了

完整的異常語法

在這裏插入圖片描述


try:
    # 提示用戶輸入一個整數
    num = int(input("請輸入一個整數:"))

    # 使用 8 初一用戶輸入的整數並且輸出
    result = 8 / num

    print(result)

# except ZeroDivisionError:
#     print("除零錯誤")

except ValueError:
    print("請輸入正確的整數")

except Exception as result:
    print("未知錯誤 %s " % result)
else:
    # 沒有異常纔會執行的代碼
    print("嘗試成功")
finally:
    # 不論是否出現錯誤都會執行的代碼
    print("不論是否出現錯誤都會執行的代碼")

print("-" * 50)

在這裏插入圖片描述

異常具有傳遞性


def demo1():
    return int(input("輸入整數:"))

def demo2():
    return demo1()


# 利用異常的傳遞性,在主程序捕獲異常
try:
    print(demo2())
except Exception as result:
    print("未知錯誤 %s" % result)

在這裏插入圖片描述

首先執行print()函數裏的demo2()–> demo2()執行 demo1()函數 --> demo1()接收到字母a,出現語法錯誤。–>將錯誤傳遞返回demo2() --> demo2()函數將錯誤傳遞迴print()函數–>觸發異常機制,執行觸發機制。
我展示一下去掉try: except: 時出現的報錯情況
在這裏插入圖片描述

自定義異常

在這裏插入圖片描述

def input_password():

    # 1. 提示用戶輸入密碼
    pwd = input("請輸入密碼:")

    # 2. 判斷密碼長度 >= 8 , 返回用戶輸入的密碼
    if len(pwd) >= 8:
        return pwd

    # 3. 如果  < 8 主動拋出密碼
    print("主動拋出異常")
    # 1. 創建異常對象
    ex = Exception("密碼長度不夠")

    # 2. 主動拋出異常
    raise ex


# 提示用戶輸入密碼
while True:
    try:
        print(input_password())
        break
    except Exception as result:
        print("未知異常:%s" % result)
        print("請重新輸入...")
print("提交密碼")

如果密碼不夠長,告訴你密碼長度不夠
在這裏插入圖片描述
如果把try: except: 去掉,我們在輸入密碼:123,我們就能看見我們熟悉的界面了。

def input_password():

    # 1. 提示用戶輸入密碼
    pwd = input("請輸入密碼:")

    # 2. 判斷密碼長度 >= 8 , 返回用戶輸入的密碼
    if len(pwd) >= 8:
        return pwd

    # 3. 如果  < 8 主動拋出密碼
    # print("主動拋出異常")
    # 1. 創建異常對象
    ex = Exception("密碼長度不夠")

    # 2. 主動拋出異常
    raise ex

print(input_password())

在這裏插入圖片描述

小總結

很多源代碼都會使用try: expcpt: 因爲這樣就能讓代碼更健壯,更穩定。即使出現Bug也不會使程序崩潰,讓客戶的體驗感更好寫。所以在開發程序時,使用try: except: 這種異常處理機制使必不可少的!!!
interactiveshell.py的源代碼截圖
在這裏插入圖片描述

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