1. 程式人生 > >python學習筆記13(異常處理)

python學習筆記13(異常處理)

異常處理

需求: 當程式遇到問題時不讓程式結束,而越過錯誤繼續向下執行

try……except……else語句
格式:

try:
    語句t
except 錯誤碼 as e:
    語句1
except 錯誤碼 as e:
    語句2
……
except 錯誤碼 as e:
    語句n
else:
    語句e

注意: else語句可有可無

作用: 用來檢測try語句塊中的錯誤,從而讓except語句捕獲錯誤資訊並處理

邏輯: 當程式執行到try-except-else語句時
1、如果當try“語句t”執行出現錯誤,會匹配第一個錯誤碼,如果匹配上就執行對應"語句"
2、如果當try“語句t”執行出現錯誤,沒有匹配的異常,錯誤將會被提交到上一層的try語句。或者到程式的最上層
3、如果當try“語句t”執行沒有出現錯誤,執行else下的“語句e”(你得有)

try:
    print(3 / 1)
except NameError as e:
    print("沒有該變數")
except ZeroDivisionError as e:
    print("除數為0了")
else:
    print("程式碼沒有問題")
#輸出:
3.0
程式碼沒有問題  

使用except而不使用任何的錯誤型別

try:
    #print(4 / 0)
    print(num)
except:
    print("程式出現了異常")

#使用except帶著多種異常
try:
    print(5 / 0)
except (NameError, ZeroDivisionError):
    print("出現了NameError或ZeroDivisionError")
#輸出:
程式出現了異常
出現了NameError或ZeroDivisionError

特殊
1、錯誤其實是class(類),所有的錯誤都繼承自BaseException,所以在捕獲的時候,它捕獲了該型別的錯誤,還把子類一網打盡

try:
    print(5 / 0)
except BaseException as e:
    print("異常1")
except ZeroDivisionError as e:
    print("異常2")
#輸出:異常1

2、跨越多層呼叫,main呼叫了func2,func2呼叫了func1,func1出現了錯誤,這時只要main捕獲到了就可以處理

def func1(num):
    print(1 / num)
def func2(num):
    func1(num)
def main():
    func2(0)

try:
    main()
except ZeroDivisionError as e:
    print("****")
#輸出:****

try……except……finally語句
格式:

try:
    語句t
except 錯誤碼 as e:
    語句1
except 錯誤碼 as e:
    語句2
……
except 錯誤碼 as e:
    語句n
finally:
    語句f

作用: 語句t無論是否有錯誤都將執行最後的語句f

示例:

try:
    print(1/0)
except NameError as e:
    print("為0了")
finally:
    print("必須執行我")

常見的異常型別:
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

斷言:

def func(num, div):

    assert (div != 0), "div不能為0"
    return  num / div

print(func(10, 0))
#輸出:AssertionError: div不能為0