Python 面向?qū)ο?8: 異常

一、內(nèi)容總覽

  • 1.1、異常的概念
  • 1.2、捕獲異常
  • 1.3、異常的傳遞
  • 1.4、拋出異常

二、異常的概念

  • 2.1、程序在運(yùn)行時,如果 Python 解釋器 遇到 到一個錯誤,會停止程序的執(zhí)行,并且提示一些錯誤信息,這就是 異常
  • 2.2、程序停止執(zhí)行并且提示錯誤信息 這個動作,我們通常稱之為:拋出(raise)異常
    異常示意圖

    程序開發(fā)時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕獲 可以針對突發(fā)事件做集中的處理,從而保證程序的 穩(wěn)定性健壯性

三、捕獲異常

  • 3.1、 簡單的捕獲異常語法

    • 在程序開發(fā)中,如果 對某些代碼的執(zhí)行不能確定是否正確,可以增加 try(嘗試) 來 捕獲異常

    • 捕獲異常最簡單的語法格式:

      try:
          嘗試執(zhí)行的代碼
      except:
          出現(xiàn)錯誤的處理
      
    • try 嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執(zhí)行的代碼

    • except 如果try里面的代碼出現(xiàn)錯誤,就會走except下面的代碼,并且整個程序的代碼正常執(zhí)行

    • 如下面簡單的例子: 要求用戶輸入整數(shù)(如果用戶輸入的不是整數(shù),就會走except下面 )

      try:
            # 代碼的執(zhí)行不能確定是否正確
            num = int(input("請輸入整數(shù):"))
      except:
            # 錯誤的代碼處理
            print("請輸入正確的整數(shù)")
      
      print("#"*50)
      
  • 3.2、錯誤類型捕獲

    • 在程序執(zhí)行時,可能會遇到 不同類型的異常,并且需要 針對不同類型的異常,做出不同的響應(yīng),這個時候,就需要捕獲錯誤類型了

    • 語法如下:

      try:
          # 嘗試執(zhí)行的代碼
          pass
      except 錯誤類型1:
          # 針對錯誤類型1,對應(yīng)的代碼處理
          pass
      except (錯誤類型2, 錯誤類型3):
          # 針對錯誤類型2 和 3,對應(yīng)的代碼處理
          pass
      except Exception as result:
          print("未知錯誤 %s" % result)
      
    • 當(dāng) Python 解釋器 拋出異常 時,最后一行錯誤信息的第一個單詞,就是錯誤類型

      最后一行錯誤信息的第一個單詞,就是錯誤類型*

    • 異常類型捕獲演練 —— 要求用戶輸入整數(shù)

      • 需求:1、提示用戶輸入一個整數(shù);2、使用 8 除以用戶輸入的整數(shù)并且輸出

        try:
            num = int(input("請輸入整數(shù):"))
            result = 8 / num
            print(result)
        except ValueError:
        
            print("請輸入正確的整數(shù)")
        
        except Exception as result:
        
           # 不知道錯誤類型是什么
           print("錯誤信息是 %s" % result)
        
        print("#"*50)
        
    • 捕獲未知錯誤

      • 在開發(fā)時,要預(yù)判到所有可能出現(xiàn)的錯誤,還是有一定難度的

      • 如果希望程序 無論出現(xiàn)任何錯誤,都不會因?yàn)?Python 解釋器 拋出異常而被終止,可以再增加一個 except,語法如下:result是錯誤的信息

        except Exception as result:
               print("未知錯誤 %s" % result)
        
  • 3.3、異常捕獲完整語法

    • 在實(shí)際開發(fā)中,為了能夠處理復(fù)雜的異常情況,完整的異常語法如下

      try:
          # 嘗試執(zhí)行的代碼
          pass
      except 錯誤類型1:
          # 針對錯誤類型1,對應(yīng)的代碼處理
          pass
      except 錯誤類型2:
          # 針對錯誤類型2,對應(yīng)的代碼處理
          pass
      except (錯誤類型3, 錯誤類型4):
          # 針對錯誤類型3 和 4,對應(yīng)的代碼處理
          pass
      except Exception as result:
          # 打印錯誤信息
          print(result)
      else:
          # 沒有異常才會執(zhí)行的代碼
          pass
      finally:
          # 無論是否有異常,都會執(zhí)行的代碼
          print("無論是否有異常,都會執(zhí)行的代碼")
      
    • else 只有在沒有異常時才會執(zhí)行的代碼

    • finally 無論是否有異常,都會執(zhí)行的代碼

四、異常的傳遞

  • 4.1、異常的傳遞 —— 當(dāng) 函數(shù)/方法 執(zhí)行 出現(xiàn)異常,會 將異常傳遞 給 函數(shù)/方法 的 調(diào)用一方
  • 4.2、如果 傳遞到主程序,仍然 沒有異常處理,程序才會被終止

提示:

  • 在開發(fā)中,可以在主函數(shù)中增加 異常捕獲
  • 而在主函數(shù)中調(diào)用的其他函數(shù),只要出現(xiàn)異常,都會傳遞到主函數(shù)的 異常捕獲
  • 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔
  • 4.3、看下面的示例:主程序調(diào)用 demo2,demo2又去調(diào)用demo1,當(dāng)demo1里面出現(xiàn)異常的時候,會把異常傳給demo2,demo2又會傳給主程序

    def demo1():
         return int(input("請輸入一個整數(shù):"))
    def demo2():
         return demo1()
    try:
         print(demo2())
    except ValueError:
         print("請輸入正確的整數(shù)")
    except Exception as result:
         print("未知錯誤 %s" % result)
    

五、拋出 raise 異常

  • 5.1、應(yīng)用場景

    • 在開發(fā)中,除了 代碼執(zhí)行出錯 Python 解釋器會 拋出 異常之外
    • 還可以根據(jù) 應(yīng)用程序 特有的業(yè)務(wù)需求 主動拋出異常
    • 示例
      • 提示用戶 輸入密碼,如果 長度少于 8,拋出 異常


        自定義異常
    • 注意:
      • 當(dāng)前函數(shù) 只負(fù)責(zé) 提示用戶輸入密碼,如果 密碼長度不正確,需要其他的函數(shù)進(jìn)行額外處理
      • 因此可以 拋出異常,由其他需要處理的函數(shù) 捕獲異常
  • 5.2、主動拋出異常

    • Python 中提供了一個 Exception 異常類

    • 在開發(fā)時,如果滿足 特定業(yè)務(wù)需求時,希望 拋出異常,可以:

      • 創(chuàng)建 一個 Exception 的 對象

      • 使用 raise 關(guān)鍵字 拋出 異常對象

        # 創(chuàng)建異常對象
        ex = Exception("異常提示信息,自己寫")
        # 使用 raise 拋出異常對象
        raise ex
        
    • 需求

      • 定義 input_password 函數(shù),提示用戶輸入密碼
      • 如果用戶輸入長度 < 8,拋出異常
      • 如果用戶輸入長度 >=8,返回輸入的密碼
    • 代碼如下:

      def input_password():
      
           # 1、提示用戶輸入密碼
           password = input("請輸入密碼:")
      
           # 2、密碼長度大于8 返回密碼
           if len(password) > 8:
                return password
      
           # 3、密碼長度不夠,需要拋出異常
           # 1> 創(chuàng)建異常對象 - 使用異常的錯誤信息字符串作為參數(shù)
           ex = Exception("密碼長度不夠")
           # 2、使用 raise 拋出異常對象
           raise ex
      
      try:
         print(input_password())
      except Exception as result:
         print("錯誤信息是:%s"% result)
      
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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