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的源代碼截圖