例外處理
例外
- 例外即是一個事件,該事件會在程式執行程序中發生,影響了程式的正常執行,
- 一般情況下,在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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551279.html
標籤:其他
上一篇:Java中抽象類和介面的區別?
下一篇:返回列表
