天天看點

14、錯誤處理

錯誤

  • 文法錯誤(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

繼續閱讀