錯誤
- 文法錯誤(SyntaxError)
- 邏輯錯誤
異常
- 文法和邏輯沒有問題,程式執行過程中出現未知錯誤
- 如:除零報錯、字典或清單索引超出範圍等等
常見系統異常
- 除零錯誤 ZeroDivisionError
- 名稱異常 NameError
- 類型異常 TypeError
- 索引異常 IndexError
- 鍵異常 KeyError
- 值異常 ValueError
- 屬性異常 AttributeError
- 疊代器異常 StopIteration
系統異常類繼承樹
BaseException–>Exception、SystemExit、GeneratorExit、Keyboardlnterrupt
- BaseException是所有内建的異常的基類
- Keyboardlnterrupt:當使用者點選中斷鍵 (通常ctrl + C) 時引發
- GeneratorExit:當調用一種generator的close()方法時引發
- SystemExit:由sys.exit()函數引發。當它不處理時,Python 解釋器退出
-
Exception 是 所有内置的、 非系統退出異常是從該類派生的。
應該從該類派生所有使用者定義的異常。
解決異常-預防
添加容錯代碼
解決異常-捕獲
文法
try:
可能會出現異常的代碼
except 捕捉的異常類别 as 接收異常的參數:
對應這個異常的代碼處理
[可以有多個except重複, 用于捕捉可能的其他異常;
如果針對于多個不同的異常有相同的處理方式, 那麼可以将多個異常合并]
else:(可省去)
沒出現異常時做的處理
finally:(可省去)
代碼塊
不管有沒有出現異常,都會執行該代碼塊
注意
- try語句沒有捕捉到異常,先執行try代碼塊,再執行else代碼塊,最後執行finally代碼塊
- 如果try捕捉到異常,首先執行except處理錯誤,再執行finally
- 如果異常名稱不确定的,而又想捕捉,那麼except 後的捕捉異常類别可直接寫Exception
除法運算
def num1(a,b):
res = a / b
print(res)
def num2(a,b):
try:
res = a / b
except ZeroDivisionError as z:
print("錯誤處理",z)
else:
print(res)
finally:
print("good")
num2(2,1)
運作結果:
2.0
good
num2(2,0)
運作結果:
錯誤處理 division by zero
good
手動抛出異常
- 通過 raise 語句直接抛出相關類型的異常
- 什麼時候應該向外界抛出異常?
- 什麼時候應該内部做好容錯處理?
def age(age):
if age <= 0 or age > 100:
raise ValueError('指派錯誤')
else:
print("設定的age為:",age)
try:
age(500)
except ValueError as v:
print(v)
運作結果:
指派錯誤
自定義異常
- 繼承與父類:Exception