Python中的異常處理

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的異常處理方式,以上就是我的一些分享。
對于另一種異常處理(推測),將會在以后的學習使用中和大家交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容