1.異常是什么?
1.1異常
就是不正常的情況,程序開發(fā)過程中錯誤和bug都是不正常的情況
1.2異常發(fā)生的后果
引發(fā)程序崩潰
1.3處理異常(容錯)
包容出現(xiàn)的不正常的錯誤,保證程序的正常的執(zhí)行
1.4處理異常的方式
- try-except:異常捕獲處理
- assertions:斷言測試
2.熟悉異常處理的步驟
基本語法:
try:
可能出現(xiàn)異常的代碼
except <異常名稱>:
一旦出現(xiàn)異常執(zhí)行的代碼
else:
沒有異常時執(zhí)行的代碼
finally:
不論是否有異常都會執(zhí)行的代碼
這里用代碼能更好地表達
num = ("請輸入一個數(shù)字:")
num = int(num)#這里把字符串類型轉(zhuǎn)化為整形
print("你輸入的數(shù)字是:%s"%num)
#如果用戶輸入數(shù)字程序正常運行輸出數(shù)字
#如果用戶輸入的不是數(shù)字程序則會報錯終止
#錯誤類型為ValueError
#如果我們采取異常處理,即使輸入的不是數(shù)字也不會終止
num = ("請輸入一個數(shù)字:")
try:#可能出錯的代碼(相當于守株待兔)
num = int(num)#這里把字符串類型轉(zhuǎn)化為整形
except:#不指定錯誤,意味著可以處理所有可能出現(xiàn)的錯誤
print("不好意思,你輸入了非法數(shù)據(jù)")
else:#程序正常執(zhí)行時執(zhí)行的代碼
print("你輸入的數(shù)字是:%s"%num)
上面的expect后面沒有跟任何錯誤類型,這意味著無論出現(xiàn)什么錯誤,都會顯示輸入了非法數(shù)據(jù)。
但是,在實際應(yīng)用中,try所包含的代碼中可能不止一種錯誤,為了區(qū)分錯誤或者對不同的錯誤做不同的處理,我們需要在except后面加上錯誤的種類。
如下面程序中出現(xiàn)兩處異常,分別是 1.選項輸入錯誤 2.文件讀取錯誤
對于多錯誤的代碼我們可以用一個except處理異常,當然用多個except處理分類更明確,效果更好,代碼如下
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)
print("程序執(zhí)行完成..")
#此時文件中可能出現(xiàn)輸入不符合要求的ValueError錯誤和找不到文件的FileNotFoundError錯誤
#注意:當捕獲到第一個異常時,程序不在繼續(xù)捕獲而是執(zhí)行后面的代碼
#下面展示分別捕獲,使用多個except
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í)行完成..")
#同上,當捕獲到第一個異常時,將不再捕捉下面的異常,而是執(zhí)行后面的代碼
#注意:這里由于Exception錯誤是上面兩個錯誤的父類,所以不能寫那兩個錯誤前面,否則那兩個except將不會觸發(fā)。
自定義異常
關(guān)于自定義異常,這個不過多敘述。他的本質(zhì)是定義一個異常(可以是把系統(tǒng)中敘述不太直觀的異常,轉(zhuǎn)化為我們?nèi)菀桌斫獾漠惓#蛼伋霎惓5恼Z法。
#自定義一個異常
class NumError(Exception):#繼承他的父類
def __init__(self):
Exception.__init__(self, "這里必須要輸入數(shù)字,但是您輸入了非法字符")
try:
num = int(input("請輸入一個數(shù)值:"))
except ValueError: # 捕獲系統(tǒng)異常
raise NumError() #拋出異常的語法
else: #執(zhí)行正確時執(zhí)行的代碼
print("用戶輸入了:%d" % num)
#后面的代碼
print("程序執(zhí)行完成")
這是自定義異常的一個小應(yīng)用,通過自定義異常,把ValueError錯誤轉(zhuǎn)化成了一段我們能夠直觀看懂的中文
對于自定義拋出的異常,我們更加便于去操作他們:
class NumError(Exception):
def __init__(self):
Exception.__init__(self, "這里必須要輸入數(shù)字,但是您輸入了非法字符")
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)
這里我們可以看出對于A程序員拋出的異常,B程序員在引用這段代碼時,能夠很容易的去處理這個異常
上面已經(jīng)說過else后面的代碼是不出現(xiàn)異常是執(zhí)行的,那么finally中的代碼呢
我們可以把finally理解為打掃戰(zhàn)場的,最后收尾。比如
try:
f = open("d:/test.txt", "w")
f.write(["a", "b"])
except FileNotFoundError as e:
print("文件操作失敗")
finally:
f.close()
#這里我們用finally來關(guān)閉文件夾,還不是美滋滋。
關(guān)于try-except的異常處理方式,以上就是我的一些分享。
對于另一種異常處理(推測),將會在以后的學習使用中和大家交流