乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      三、Python try except異常處理詳解(入門必讀)

       星光閃亮圖書館 2019-08-08
      Python 提供了try except語句捕獲并處理異常,該異常處理語句的基本語法結(jié)構(gòu)如下:

      try:
          可能產(chǎn)生異常的代碼塊
      except [(Error1, Error2, ...) [as e]]:
          處理異常的代碼塊1
      except [(Error3, Error4, ...) [as e]]:
          處理異常的代碼塊2

      該格式中,[] 括起來的部分可以使用,也可以省略;(Error1,Error2,...) 、(Error3,Error4,...) 表示各自的 except 塊可以處理異常的具體類型;[as e] 表示將異常類型賦值給變量 e(方便在 except 塊中調(diào)用異常類型)。

      注意,except 后面也可以不指定具體的異常名稱,這樣的話,表示要捕獲所有類型的異常。

      另外,從 try except 的基本語法格式可以看出,try 塊僅有一個(gè),但 except 代碼塊可以有多個(gè),這是為了針對(duì)不同的異常類型提供不同的異常處理方式。當(dāng)程序發(fā)生不同的意外情況時(shí),會(huì)對(duì)應(yīng)不同的異常類型,Python 解釋器就會(huì)根據(jù)該異常類型來決定使用哪個(gè) except 塊來處理該異常。

      通過在 try 塊后提供多個(gè) except 塊可以無須在異常處理塊中使用 if 判斷異常類型,但依然可以針對(duì)不同的異常類型提供相應(yīng)的處理邏輯,從而提供更細(xì)致、更有條理的異常處理邏輯。

      try except 語句的執(zhí)行流程如下:
      1. 首先執(zhí)行 try 中的代碼塊,如果執(zhí)行過程中出現(xiàn)異常,系統(tǒng)會(huì)自動(dòng)生成一個(gè)異常對(duì)象,該異常對(duì)象會(huì)提交給 Python 解釋器,此過程被稱為引發(fā)異常

      2. 當(dāng) Python 解釋器收到異常對(duì)象時(shí),會(huì)尋找能處理該異常對(duì)象的 except 塊,如果找到合適的 except 塊,則把該異常對(duì)象交給該 except 塊處理,這個(gè)過程被稱為捕獲異常。如果 Python 解釋器找不到捕獲異常的 except 塊,則程序運(yùn)行終止,Python 解釋器也將退出。


      事實(shí)上,不管程序代碼塊是否處于 try 塊中,甚至包括 except 塊中的代碼,只要執(zhí)行該代碼塊時(shí)出現(xiàn)了異常,系統(tǒng)總會(huì)自動(dòng)生成一個(gè) Error 對(duì)象。如果程序沒有為這段代碼定義任何的 except 塊,則 Python 解釋器無法找到處理該異常的 except 塊,程序就會(huì)停止運(yùn)行;反之,如果程序發(fā)生異常,并且該異常經(jīng) try 捕獲并由 except 處理完成,則程序會(huì)繼續(xù)執(zhí)行。

      舉個(gè)例子:
      try:a = int(input("輸入被除數(shù):"))b = int(input("輸入除數(shù):"))c = a / bprint("您輸入的兩個(gè)數(shù)相除的結(jié)果是:", c )except (ValueError, ArithmeticError):print("程序發(fā)生了數(shù)字格式異常、算術(shù)異常之一")except :print("未知異常")print("程序繼續(xù)運(yùn)行")
      程序運(yùn)行結(jié)果為:

      輸入被除數(shù):a
      程序發(fā)生了數(shù)字格式異常、算術(shù)異常之一
      程序繼續(xù)運(yùn)行

      上面程序中,第 6 行代碼使用了(ValueError, ArithmeticError)來指定所捕獲的異常類型,這就表明該 except 塊可以同時(shí)捕獲這 2 種類型的異常;第 8 行代碼只有 except 關(guān)鍵字,并未指定具體要捕獲的異常類型,這種省略異常類的 except 語句也是合法的,它表示可捕獲所有類型的異常,一般會(huì)作為異常捕獲的最后一個(gè) except 塊。

      除此之外,由于 try 塊中引發(fā)了異常,并被 except 塊成功捕獲,因此程序才可以繼續(xù)執(zhí)行,才有了“程序繼續(xù)運(yùn)行”的輸出結(jié)果。

      訪問異常信息

      如果程序需要在 except 塊中訪問異常對(duì)象的相關(guān)信息,可以通過為 except 塊添加as a來實(shí)現(xiàn)。當(dāng) Python 解釋器決定調(diào)用某個(gè) except 塊來處理該異常對(duì)象時(shí),會(huì)將異常對(duì)象賦值給 except 塊后的異常變量,程序即可通過該變量來獲得異常對(duì)象的相關(guān)信息。

      所有的異常對(duì)象都包含了如下幾個(gè)常用屬性和方法:
      • args:該屬性返回異常的錯(cuò)誤編號(hào)和描述字符串。

      • errno:該屬性返回異常的錯(cuò)誤編號(hào)。

      • strerror:該屬性返回異常的描述宇符串。

      • with_traceback():通過該方法可處理異常的傳播軌跡信息。


      下面例子演示了程序如何訪問異常信息:
      def foo():try:fis = open("a.txt");except Exception as e:# 訪問異常的錯(cuò)誤編號(hào)和詳細(xì)信息print(e.args)# 訪問異常的錯(cuò)誤編號(hào)print(e.errno)# 訪問異常的詳細(xì)信息print(e.strerror)foo()
      從上面程序可以看出,如果要訪問異常對(duì)象,只要在單個(gè)異常類或異常類元組(多異常捕獲)之后使用 as 再加上異常變量即可。

      在 Python 的早期版本中,直接在單個(gè)異常類或異常類元組(多異常捕獲)之后添加異常變量,中間用逗號(hào)隔開即可。

      上面程序調(diào)用了 Exception 對(duì)象的 args 屬性(該屬性相當(dāng)于同時(shí)返回 errno 屬性和 strerror 屬性)訪問異常的錯(cuò)誤編號(hào)和詳細(xì)信息。運(yùn)行上面程序,會(huì)看到如下運(yùn)行結(jié)果:

      (2, 'No such file or directory')
      2
      No such file or directory

      從上面的運(yùn)行結(jié)果可以看到,由于程序嘗試打開的文件不存在,因此引發(fā)的異常錯(cuò)誤編號(hào)為 2,異常詳細(xì)信息為:No such file or directory。

      關(guān)于如何處理異常的傳播軌跡信息,以及使用 open() 方法來打開一個(gè)文件,用于讀取磁盤文件的內(nèi)容,后續(xù)章節(jié)還有更詳細(xì)的介紹,此處暫不詳細(xì)講解。

      異常類的繼承體系

      當(dāng) Python 解釋器接收到異常對(duì)象時(shí),如何為該異常對(duì)象尋找 except 塊呢?注意上面程序中 except 塊的 except Exception,這意味著此 except 塊專門用來處理該異常類以及其子類的異常實(shí)例。

      當(dāng) Python 解釋器接收到異常對(duì)象后,會(huì)依次判斷該異常對(duì)象是否是 except 塊后的異常類或其子類的實(shí)例,如果是,Python 解釋器將調(diào)用該 except 塊來處理該異常;否則,再次拿該異常對(duì)象和下一個(gè) except 塊里的異常類進(jìn)行比較。

      Python 異常捕獲流程示意圖如圖 1 所示:

      Python 異常捕獲流程示意圖
      圖 1 Python 異常捕獲流程示意圖

      從圖 1 中可以看出,在通常情況下,如果 try 塊被執(zhí)行一次,則 try 塊后只有一個(gè) except 塊會(huì)被執(zhí)行,不可能有多個(gè) except 塊被執(zhí)行。除非在循環(huán)中使用了 continue 開始下一次循環(huán),下一次循環(huán)又重新運(yùn)行了 try 塊,這才可能導(dǎo)致多個(gè) except 塊被執(zhí)行。

      Python 的所有異常類都從 BaseException 派生而來,提供了豐富的異常類,這些異常類之間有嚴(yán)格的繼承關(guān)系,圖 2 顯示了 Python 的常見異常類之間的繼承關(guān)系。

      Python 的常見異常類之間的繼承關(guān)系
      圖 2 Python 的常見異常類之間的繼承關(guān)系

      從圖 2 中可以看出,Python 的所有異常類的基類是 BaseException,但如果用戶要實(shí)現(xiàn)自定義異常,則不應(yīng)該繼承這個(gè)基類,而是應(yīng)該繼承 Exception 類。

      BaseException 的主要子類就是 Exception,不管是系統(tǒng)的異常類,還是用戶自定義的異常類,都應(yīng)該從 Exception 派生。

      下面看幾個(gè)簡單的異常捕獲的例子:
      try:    a = int(input("輸入被除數(shù):"))    b = int(input("輸入除數(shù):"))    c = a / b    print("您輸入的兩個(gè)數(shù)相除的結(jié)果是:", c )except ValueError:    print("數(shù)值錯(cuò)誤:程序只能接收整數(shù)參數(shù)")except ArithmeticError:    print("算術(shù)錯(cuò)誤")except Exception:    print("未知異常")
      上面程序針對(duì) ValueError、ArithmeticError 類型的異常,提供了專門的異常處理邏輯。該程序運(yùn)行時(shí)的異常處理邏輯可能有如下幾種情形:
      • 如果在運(yùn)行該程序時(shí)輸入的參數(shù)不是數(shù)字,而是字母,將發(fā)生數(shù)值錯(cuò)誤,Python 將調(diào)用 ValueError 對(duì)應(yīng)的 except 塊處理該異常。

      • 如果在運(yùn)行該程序時(shí)輸入的第二個(gè)參數(shù)是 0,將發(fā)生除 0 異常,Python 將調(diào)用 ArithmeticError 對(duì)應(yīng)的 except 塊處理該異常。

      • 如果在程序運(yùn)行時(shí)出現(xiàn)其他異常,該異常對(duì)象總是 Exception 類或其子類的實(shí)例,Python 將調(diào)用 Exception 對(duì)應(yīng)的 except 塊處理該異常。

      上面程序中的異常類型,都是非常常見的運(yùn)行時(shí)異常,讀者應(yīng)該記住這些異常,并掌握在哪些情況下可能出現(xiàn)這些異常。

      正如在前面程序中所看到的,程序總是把對(duì)應(yīng) Exception 類的 except 塊放在最后,這是為什么呢?想一下圖 1 所示的 Python 異常捕獲流程,可能你就會(huì)明白,如果把 Exception 類對(duì)應(yīng)的 except 塊排在其他 except 塊的前面,Python 解釋器將直接進(jìn)入該 except 塊(因?yàn)樗械漠惓?duì)象都是 Exception 或其子類的實(shí)例),而排在它后面的 except 塊將永遠(yuǎn)也不會(huì)獲得執(zhí)行的機(jī)會(huì)。

      實(shí)際上,在進(jìn)行異常捕獲時(shí),不僅應(yīng)該把 Exception 類對(duì)應(yīng)的 except 塊放在最后,而且所有父類異常的 except 塊都應(yīng)該排在子類異常的 except 塊的后面( 即:先處理小異常,再處理大異常)。

      雖然 Python 語法沒有要求,但在實(shí)際編程時(shí)一定要記住先捕獲小異常,再捕獲大異常。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請遵守用戶 評(píng)論公約

        類似文章 更多