- 什么是異常
異常:不正常的情況
不正常的情況踢故,在程序中文黎,會有兩種體現(xiàn)
? 自己造孽:寫錯代碼了惹苗!錯誤也是一種異常;程序都運行不起來耸峭!
? 程序運行過程中桩蓉,在某些特定條件下,不合適的數(shù)據(jù)引起程序出現(xiàn)錯誤導(dǎo)致程序崩潰
? 要求用戶輸入一個數(shù)字劳闹,但是用戶誤操作輸入了字符串院究,在進行類型轉(zhuǎn)換時就會出現(xiàn)錯誤導(dǎo)致程序崩潰!
為什么要處理異常:
當(dāng)程序在運行過程中本涕,由于用戶的誤操作或者不合適的數(shù)據(jù)引發(fā)的程序錯誤业汰,讓代碼自己處理并保證程序的正常執(zhí)行。而不至于因為錯誤導(dǎo)致程序崩潰菩颖!
提高代碼的健壯性样漆!
怎么處理異常:
? 捕獲處理異常
? 斷言處理異常【測試異常信息】[擴展]
捕獲處理異常語法:
try: # 嘗試晦闰,通常情況氛濒,將可能出現(xiàn)異常的代碼,包含在try中
<可能會出現(xiàn)異常的代碼>
except [異常信息]: # 一旦出現(xiàn)異常鹅髓,代碼就會直接從出現(xiàn)異常的地方跳轉(zhuǎn)到except中執(zhí)行
<出現(xiàn)異常之后要執(zhí)行的代碼>
else: # 如果try中的代碼執(zhí)行沒有異常舞竿,執(zhí)行完畢后,就會執(zhí)行else中的代碼
<正常執(zhí)行try之后窿冯,else中的代碼執(zhí)行>
finally: # 不論是否出現(xiàn)異常骗奖,都要在try執(zhí)行完成之后執(zhí)行的代碼
<最終的掃尾工作>
案例操作:
要處理異常:
<適合新手和老鳥>
首先要明確哪些代碼可能會出現(xiàn)異常,其次定位異承汛可能出現(xiàn)的代碼的位置执桌,然后將可能出現(xiàn)異常的代碼進行異常處理。
<適合老鳥:經(jīng)驗>
在寫代碼的同時芜赌,直接處理異常
基本異常處理
try-except直接處理異逞稣酰【可以處理任何異常—不能定位具體是什么異巢颍】
try-except [異常信息] 【可以處理指定的異潮旌】常見的異常
所有異常的超類:BaseException
標(biāo)準(zhǔn)異常的超類:Exception(BaseException)
程序執(zhí)行過程中經(jīng)常看到的異常:
……處理多個異常
try-except (E1, E2, E3, …,En) as e 一個except處理指定的多個異常
try-except E1-except E2-except E3… 每個except處理指定的異常
通常情況下洲愤,我們要查看異常信息颓芭,就需要打印異常信息—打印e變量的值
問題:
1) 系統(tǒng)提供的異常信息,晦澀難懂柬赐!
2) 系統(tǒng)提供的異常信息亡问,畢竟有限!
自定義異常
異掣厮危— 一種對象
自定義異常 – 一種自定義類型
自定義類型[異常] – 參考標(biāo)準(zhǔn)異常(繼承Exception)—自定義異常(繼承Exception)主動拋出異常
在開發(fā)的過程中州藕,主動出現(xiàn)一種錯誤束世,將錯誤拋出給程序告訴程序出錯了。
通過raise關(guān)鍵字床玻,拋出一個異常自定義異常毁涉,就是為了專門拋出錯誤的,拋出錯誤笨枯,就是嚴(yán)重警告這里出現(xiàn)了什么問題
首先-代碼執(zhí)行過程中薪丁,出現(xiàn)了異秤鑫鳎【系統(tǒng)標(biāo)準(zhǔn)異诚诰】【信息不是很明白】
捕獲系統(tǒng)異常,創(chuàng)建一個自定義異常
拋出自定義異沉惶矗【自定義異持薷遥】【信息明確的錯誤】
自定義異常的目的:轉(zhuǎn)換異常信息,將不明確的異常信息轉(zhuǎn)換成更加精確的異常信息
print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
print("\t\t計算器系統(tǒng)")
print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
num_str = input("請輸入要計算的數(shù)值:")
try:
num_int = int(num_str) #ValueError
except ValueError as e:# 不指定要處理的具體異常茄蚯,意味這可以處理所有可能出現(xiàn)的異常压彭!
print("不好意思,您輸入了非法數(shù)據(jù)渗常,%s" % e)
else:
print("用戶輸入了第一個數(shù)據(jù):%d" % num_int)
轉(zhuǎn)換異常信息:異常的傳遞~傳遞更加明確的異常壮不,給后面的代碼進行處理!
多個異常的代碼的例子:
print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
print("\t\t1.文件操作——讀取數(shù)據(jù)")
print("~ * ~ * ~ * ~ * ~ * ~ * ~ * ~")
# try:
# c = int(input("請輸入您的選項:")) #ValueError
# if c == 1:
# f = open("d:/test.txt") # FileNotFoundError
# print(f.read())
# f.close()
# except (ValueError, FileNotFoundError) as e:
# print("程序中出現(xiàn)了錯誤:%s" % e)
# 使用多個except
# 如果是同一個級別的異常皱碘,根據(jù)try中出現(xiàn)異常的順序進行捕獲
# 如果不是同一個級別的異常询一,先捕獲具體的【子類異常】癌椿,再捕獲抽象的【父類異辰∪铮】
try:
c = int(input("請輸入您的選項:")) #ValueError
if c == 1:
f = open("d:/test.txt") # FileNotFoundError
print(f.read())
f.close()
except ValueError as e:
print("選項輸入錯誤:%s" % e)
except FileNotFoundError as e:
print("文件讀取錯誤:%s" % e)
except Exception as e:
print("程序中出現(xiàn)了未知錯誤:%s" % e)
print("程序執(zhí)行完成..")
自定義異常
# V1.0 定義一個自定義異常,和拋出異常的語法
# 定義一個自定義異常
# class MyError(Exception):
# # 將錯誤描述信息踢俄,在初始化函數(shù)中缩功,交給父類
# def __init__(self, msg):
# Exception.__init__(self, msg)
#
# x = input("請輸入您的信息:")
# raise MyError("不好意思,我就是要出錯....")
# print("您輸入了:%s" % x)
class NumError(Exception):
def __init__(self):
Exception.__init__(self, "這里必須要輸入數(shù)字都办,但是您輸入了非法字符")
'''
# V2.0
try:
num = int(input("請輸入一個數(shù)值:"))
except ValueError: # 捕獲系統(tǒng)異常
raise NumError()
else:
print("用戶輸入了:%d" % num)
print("程序執(zhí)行完成")
'''
# 3.0
# 定義了一個輸入數(shù)值的函數(shù):開發(fā)人員A開發(fā)的代碼
def inputNumber():
try:
num = int(input("請輸入一個數(shù)值:"))
except ValueError: # 捕獲系統(tǒng)異常
raise NumError()
else:
print("用戶輸入了:%d" % num)
return num
# 開發(fā)人員B在開發(fā)的代碼
# 調(diào)用輸入數(shù)值的方法
try:
num = inputNumber()
except NumError as e:
print("出現(xiàn)了異常信息:%s" % e)