日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python 異常處理

系統(tǒng) 1808 0

異常:

當(dāng)Python檢測(cè)到?個(gè)錯(cuò)誤時(shí),解釋器就?法繼續(xù)執(zhí)?了,會(huì)出現(xiàn)?些錯(cuò)誤的提示,這就是所謂的"異常"。

看如下示例:

            
              print('-----test--1---')
open('123.txt','r')
print('-----test--2---')
            
          

打開?個(gè)不存在的?件123.txt,當(dāng)找不到123.txt ?件時(shí),就會(huì)拋出給我們?個(gè)IOError類型的錯(cuò)誤,No such file or directory:123.txt (沒有123.txt這樣的?件或?錄)

?


異常處理

1. 捕獲異常 try...except...
看如下示例:

            
              try:
    print('-----test--1---')
    open('123.txt','r')
    print('-----test--2---')
except IOError:
    pass
            
          

說(shuō)明:

  • 此程序看不到任何錯(cuò)誤,因?yàn)?except 捕獲到了IOError異常,并添加了處理的?法
  • pass 表示實(shí)現(xiàn)了相應(yīng)的實(shí)現(xiàn),但什么也不做;如果把pass改為print語(yǔ)句,那么就會(huì)輸出其他信息

?總結(jié):

  • 把可能出現(xiàn)問(wèn)題的代碼,放在try中
  • 把處理異常的代碼,放在except中

?

2. except捕獲多個(gè)異常
看如下示例:

            
              try:
    print num
except IOError:
    print('產(chǎn)?錯(cuò)誤了')

            
          

想?想: 上例程序,已經(jīng)使?except來(lái)捕獲異常了,為什么還會(huì)看到錯(cuò)誤的信息提示?

  • 答: except捕獲的錯(cuò)誤類型是IOError,?此時(shí)程序產(chǎn)?的異常為 NameError ,所以except沒有?效

修改后的代碼為:

            
              try:
    print(num)
except NameError:
    print('產(chǎn)?錯(cuò)誤了')
            
          

實(shí)際開發(fā)中,捕獲多個(gè)異常的?式,如下:

            
              try:
    print('-----test--1---')
    open('123.txt','r') # 如果123.txt?件不存在,那么會(huì)產(chǎn)? IOError 異常
    print('-----test--2---')
    print(num)# 如果num變量沒有定義,那么會(huì)產(chǎn)? NameError 異常
except (IOError,NameError):
    #  如果想通過(guò)?次except捕獲到多個(gè)異常可以??個(gè)元組的?式
            
          

注意:

  • 當(dāng)捕獲多個(gè)異常時(shí),可以把要捕獲的異常的名字,放到except 后,并使?元組的?式僅進(jìn)?存儲(chǔ)

?

3. 獲取異常的信息描述

Python 異常處理_第1張圖片

?

4. 捕獲所有異常

Python 異常處理_第2張圖片

?

5. else
??????? 咱們應(yīng)該對(duì) else? 并不陌?,在if中,它的作?是當(dāng)條件不滿?時(shí)執(zhí)?的實(shí)?;同樣在try...except...中也是如此,即如果沒有捕獲到異常,那么就執(zhí)?else中的事情。

            
              try:
    num = 100
    print num
except NameError as errorMsg:
    print('產(chǎn)?錯(cuò)誤了:%s'%errorMsg)
else:
    print('沒有捕獲到異常,真?興')

            
          

運(yùn)行結(jié)果如下:

Python 異常處理_第3張圖片



6. try...finally...
??????? ?論異常是否產(chǎn)?都要執(zhí)? ,那么此時(shí)就需要使?finally。如?件關(guān)閉,釋放鎖,把數(shù)據(jù)庫(kù)連接返還給連接池等。
demo:

            
              import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)
            print(content)
    except:
        #如果在讀取?件的過(guò)程中,產(chǎn)?了異常,那么就會(huì)捕獲到
        #?如 按下了 ctrl+c
        pass
    finally:
        f.close()
        print('關(guān)閉?件')

except:
    print("沒有這個(gè)?件")
            
          

說(shuō)明:
??????? test.txt?件中每??數(shù)據(jù)打印,但是我有意在每打印??之前?time.sleep?法暫停2秒鐘。這樣做的原因是讓程序運(yùn)?得慢?些。在程序運(yùn)?的時(shí)候,按Ctrl+c中斷(取消)程序。
??????? 可以觀察到KeyboardInterrupt異常被觸發(fā),程序退出。但是在程序退出之前,finally從句仍然被執(zhí)?,把?件關(guān)閉。

?


異常的傳遞

1. try嵌套中

            
              import time
try:
    f = open('test.txt')
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
                time.sleep(2)
                print(content)
    finally:
            f.close()
            print('關(guān)閉?件')
except:
    print("沒有這個(gè)?件")
            
          

運(yùn)?結(jié)果:

            
              ^C關(guān)閉?件
沒有這個(gè)?件
            
          

總結(jié):

  • try嵌套時(shí),如果??的try沒有捕獲到這個(gè)異常,那么外?的try會(huì)接收到這個(gè)異常,然后進(jìn)?處理。
  • 如果外邊的try依然沒有捕獲到,那么再進(jìn)?傳遞。。。


2. 函數(shù)嵌套調(diào)?中

            
              def test1():
    print("----test1-1----")
    print(num)
    print("----test1-2----")

def test2():
    try:
        print("----test2-1----")
        test1()
        print("----test2-2----")

    except:
        print("test2出現(xiàn)異常")
        print("----test2-3----")
        test2()
        print("------華麗的分割線-----")
            
          

總結(jié)
??????? 如果try嵌套,那么如果??的try沒有捕獲到這個(gè)異常,那么外?的try會(huì)接收到這個(gè)異常,然后進(jìn)?處理,如果外邊的try依然沒有捕獲到,那么再進(jìn)?傳遞。。。
??????? 如果?個(gè)異常是在?個(gè)函數(shù)中產(chǎn)?的,例如函數(shù)A---->函數(shù)B---->函數(shù)C,?異常是在函數(shù)C中產(chǎn)?的,那么如果函數(shù)C中沒有對(duì)這個(gè)異常進(jìn)?處理,那么這個(gè)異常會(huì)傳遞到函數(shù)B中,如果函數(shù)B有異常處理那么就會(huì)按照函數(shù)B的處理?式進(jìn)?執(zhí)?;如果函數(shù)B也沒有異常處理,那么這個(gè)異常會(huì)繼續(xù)傳遞,以此類推。。。如果所有的函數(shù)都沒有處理,那么此時(shí)就會(huì)進(jìn)?異常的默認(rèn)處理,即通常到的那樣。


拋出自定義的異常

可以? raise語(yǔ)句來(lái)引發(fā)?個(gè)異常 。異常/錯(cuò)誤對(duì)象必須有?個(gè)名字,且它們應(yīng)是Error或Exception類的?類。
下?是?個(gè)引發(fā)異常的例?:

            
              class ShortInputException(Exception):
'''?定義的異常類'''
    def __init__(self, length, atleast):
        #super().__init__()
        self.length = length
        self.atleast = atleast

    def main():
        try:
            s = input('請(qǐng)輸? --> ')
            if len(s) < 3:
                # raise引發(fā)?個(gè)你定義的異常
                raise ShortInputException(len(s), 3)
        except ShortInputException as result:    #x這個(gè)變量被綁定到了錯(cuò)誤的實(shí)例
            print('ShortInputException: 輸?的度是 %d,度?少應(yīng)是 %d'% (result.length, result.atleast))
        else:
            print('沒有異常發(fā)?.')

main()

            
          

?

Python更多:https://blog.csdn.net/Scrat_Kong/article/details/90257118


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 安陆市| 南京市| 云阳县| 梅州市| 和政县| 新巴尔虎右旗| 固安县| 榕江县| 道孚县| 武鸣县| 栾川县| 隆子县| 彩票| 黄陵县| 南平市| 静乐县| 徐闻县| 淮北市| 滨海县| 黑水县| 东海县| 江门市| 盐池县| 安平县| 茶陵县| 怀柔区| 锡林郭勒盟| 宁波市| 宝山区| 常山县| 隆尧县| 巴林左旗| 怀远县| 邯郸县| 潞城市| 西乡县| 凤阳县| 屯留县| 陆河县| 天镇县| 潮州市|