異常處理 異常 異常即是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。 一般情況下,在Python無法正常處理程式時就會發生一個異常。 異常是Python對象,表示一個錯誤。 當Python腳本發生異常時我們需要捕獲處理它,否則程式會終止執行。 捕獲異常 異常類型捕獲 # 捕獲常規異 ...
異常處理
異常
- 異常即是一個事件,該事件會在程式執行過程中發生,影響了程式的正常執行。
- 一般情況下,在Python無法正常處理程式時就會發生一個異常。
- 異常是Python對象,表示一個錯誤。
- 當Python腳本發生異常時我們需要捕獲處理它,否則程式會終止執行。
捕獲異常
異常類型捕獲
# 捕獲常規異常
try:
可能發生錯誤的代碼
except:
如果出行異常執行的代碼
# 捕獲指定異常
try:
可能發生錯誤的代碼
except NameError as e: # e = 當前異常對象
如果出行異常執行的代碼
# 捕獲多個異常
try:
可能發生錯誤的代碼
except(NameError, ZeroDisvisionError):
如果出行異常執行的代碼
# 捕獲全部異常(捕獲常規異常也可以)
try:
可能發生錯誤的代碼
except Exception as e: # e = 當前異常對象
如果出行異常執行的代碼
常見異常類型
異常名稱 | 描述 |
---|---|
AttributeError | 對象沒有這個屬性 |
OSError | 操作系統錯誤 |
ImportError | 導入模塊/對象失敗 |
IndexError | 序列中沒有此索引(index) |
KeyError | 沒有這個鍵 |
NameError | 未聲明/初始化對象 (沒有屬性) |
SyntaxError | Python 語法錯誤 |
TypeError | 對類型無效的操作 |
ValueError | 傳入無效的參數 |
Warning | 警告的基類 |
try-except-else
- 如果拋出異常執行except內部代碼
- 如果程式正常執行else內部代碼
# else異常
try:
print(1)
except Exception as e:
print(e)
else:
print("我是else,是沒有異常的時候執行的代碼")
try-except-finally
不管程式有無發生異常,都將執行finally內部代碼。
# 異常的Finally(無論是否有異常,都要執行的代碼)
try:
f = open("test.txt",'r')
except Exception as e:
f = open("test.txt",'w')
else:
print("未出現異常")
finally:
f.close()
註意:else和Finally可寫可不寫
主動觸發異常
- 在實際開發中,在程式不滿足某條件時,通常會主動拋出異常。
- 語法:raise Exception()
# 判斷煎餅熟了沒,當烹飪時間小於5時,則主動觸發沒熟異常;否則熟了。
def test(level):
if level<5:
raise Exception("沒熟沒熟")
try:
test(4)
except Exception as e:
print(e)
else:
print("熟了 請吃")
自定義異常
- 當需要自定義滿足一些規則時,就可以自定義異常。
- 自定義異常通過創建一個新的異常類,自定義名字與內容,並且需要繼承Exception類實現。
# 判斷密碼長度 如果密碼長度小於6 主動觸發異常 並拋出異常信息(列印提示)
class ShortInputError(Exception):
# 初始化方法
def __init__(self, lenght, min_lenght):
self.lenght = lenght
self.min_lenght = min_lenght
def __str__(self):
return f"你輸入的密碼長度為{self.lenght},不能低於{self.min_lenght}"
def fun():
try:
password = input("請輸入你的密碼:")
if len(password) < 6:
raise ShortInputError(len(password), 6) # 主動觸發異常 並返回提示信息
except Exception as e:
print(e)
else:
print("密碼已正確輸入!")
fun()
斷言
- assert斷言用於判斷一個表達式,當表達式條件為False時觸發斷言異常AssertionError。
- 註意:斷言用於強制用戶服從,可捕獲,但是一般不捕獲。
- 語法:assert 表達式,返回數據
print("*" * 20)
if 2 == 2:
raise AssertionError
print("*" * 20)
"""
print("*" * 20)該語句並不會執行,條件滿足,觸發了斷言,後面的語句都不會再執行
"""
print("*" * 20)
if 2 == 2:
# 捕獲斷言
try:
raise AssertionError
except Exception as e:
# 類的對象實例調用__class__屬性時會指向該實例對應的類,而後再調用 __name__ 就會輸出該實例對應的類的類名
print(e.__class__.__name__)
print("*" * 20)
try:
n = input("請輸入一個數字:")
assert n.isdigit(), "只能輸入數字" # assert 表達式,返回數據
print("你輸入的是:", n)
except Exception as ex:
print("發現錯誤:", ex)
"""
請輸入一個數字:s
發現錯誤: 只能輸入數字
"""
本文來自博客園,作者:大-鍋,轉載請註明原文鏈接:https://www.cnblogs.com/daguo118/p/17355676.html