異常 Exception
什么是錯誤:
錯誤是指由於邏輯或語法等導致一個程序無法正常執行的問題
什么是異常
異常是程序出錯時標識的一種狀態
作用:
用於信號,通知上層調用者有錯誤產生,需要處理
try 語句的兩種語法:
try-except 語句
try-finally 語句
try-except語句
語法:

try: 可能觸發異常的語句 except 錯誤類型1 [as 變量1]: 異常處理語句1 except 錯誤類型2 [as 變量2]: 異常處理語句2 except (錯誤類型3,錯誤類型4) [as 變量3]: 異常處理句塊3 ... except: 其它異常處理語句 else: 未發生異常語句 finally: 最終語句 注: [] 代表其中的內容可以省略 作用: 償式捕獲異常,得到異常通知,將程序由異常流程轉為正常流程並繼續執行

# 此示例示意異常處理語句try-except 的語法和用法 def div_apple(n): print("%d個蘋果你想分給幾個人?" % n) s = input("請輸入人數: ") cnt = int(s) # 可能觸發ValueError類型的錯誤 result = n / cnt # 可能觸發ZeroDivistion類型的錯誤 print('每個人分了', result, '個蘋果') try: print("開始分蘋果") div_apple(10) print('分蘋果成功!') except ValueError: print("分蘋果過程中出現錯誤,分蘋果失敗!!!") except ZeroDivisionError: print("沒有人來,蘋果被收回,自己吃了!!!") print("程序正常退出")

# 此示例示意異常處理語句try-except 的語法和用法 def div_apple(n): print("%d個蘋果你想分給幾個人?" % n) s = input("請輸入人數: ") cnt = int(s) # 可能觸發ValueError類型的錯誤 result = n / cnt # 可能觸發ZeroDivistion類型的錯誤 print('每個人分了', result, '個蘋果') try: print("開始分蘋果") div_apple(10) print('分蘋果成功!') except (ValueError, ZeroDivisionError): print("分蘋果失敗,蘋果不分了!") print("程序正常退出")
try-finally語句
語法:
try:
可能觸發異常的語句
finally:
最終語句
說明:
finally 子句不可以省略一定不存在except 子句
作用:
通常用try-finally語句來做觸發異常時必須要處理的事情,無論異常是否發生,finally子句都會被執行try-finally 語句不會改變程序的(正常/異常)狀態

# 此示例示意try-finally語句的作用和用法 def fry_egg(): # 煎雞蛋 print("打開天燃氣...") try: count = int(input('請輸入雞蛋個數: ')) print('成功煎了', count, '個雞蛋') finally: print("關閉天燃氣") try: fry_egg() except: print("煎雞蛋過程中出錯") print("程序正常退出")
raise 語句
作用:
觸發一個錯誤,讓程序進入異常狀態發送錯誤通知給調用者
語法:
raise 異常類型
或
raise 異常對象
或
raise # 重新觸發上一次異常

# 此示例示意raise語句的作用和用法 def make_except(): print('函數開始') # 在此處發錯ValueError類型的錯誤通知給上層調用者 raise ValueError print("函數結束") try: make_except() except ValueError: print("收到make_except函數內部發生的錯誤通知!!!") print("程序運行結束")

# 此示例示意用raise語句來傳遞錯誤信息 def fx(): print("fx開始") # ... 此處可能會觸發異常 error = ValueError("這是錯誤信息!!!") raise error print("fx結束") def fy(): print('fy開始') try: fx() except ValueError as e: print("fx函數發生錯誤,e=", e) raise # 等同於 raise e print('fy結束') try: fy() except ValueError as err: print("收到fy函數內部發生了錯誤,數據是", err) print("程序正常結束")
assert語句(斷言語句)
語法:
assert 真值表達式,錯誤數據(通常是字符串)
作用:
當真值表達式為False時,用錯誤數據創建一個AssertionError類型的錯誤,並進入異常狀態
等同於
if bool(真值表達式) == False:
raise AssertionError(錯誤數據)

def get_age(): '''此函數只返回1~140的整數''' s = input('請輸入學生年齡:') a = int(s) assert 1 <= a <= 140, '年齡超出范圍' return a try: age = get_age() print('學生的年齡是:',age) except ValueError: print('用戶輸入的不是整數!!')
異常相關的語句:
try-except 語句
接收錯誤通知
try-finally 語句
無論是正常流程還是異常流程,執行必須要執行的語句
raise 語句
觸發錯誤通知,讓程序進行異常流程
assert 語句
根據條件觸發AssertionError類型的異常通知,讓程序進入異常流程