Python 物件導向 --- 異常

來源:互聯網
上載者:User

標籤:突發事件   沒有   使用者輸入   異常類   for   error:   不同類   raise   穩定性   

目標
  • 異常的概念
  • 捕獲異常
  • 異常的傳遞
  • 自訂異常
01,異常的概念
  • 程式在運行時,如果 python 解譯器 遇到 一個錯誤,會停止程式的執行,並且提示一些錯誤資訊,這就是異常
  • 程式停止執行並且提示錯誤資訊 這個動作,我們通常稱之為:拋出(raise)異常

注 程式開發時,很難將 所有的特殊情況 都處理的面面俱到,通過 異常捕捉 可以針對突發事件做集中的處理,從而保證程式的 穩定性和健壯性

02,捕獲異常2.1 簡單的捕獲異常文法
  • 在程式開發中,如果 對某些代碼的執行不能確定是否正確,就可以增加 try(嘗試) 來 捕獲異常
  • 捕獲異常最簡單的文法格式:
try:    嘗試執行的代碼except:    出現錯誤的處理
  • try 嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執行的代碼
  • except 如果不是,下方編寫嘗試失敗的代碼
簡單異常捕捉演練 - - 要去使用者輸入整數
    try:        # 提示使用者輸入數字        num = int(input("請輸入數字:"))    except:        print("輸入有誤,請輸入正確的數字")        print("-" * 50)            # 結果呈現    請輸入數字:1    --------------------------------------------------        請輸入數字:a    輸入有誤,請輸入正確的數字    --------------------------------------------------
2.2 錯誤類型捕捉
  • 在程式執行時,可能會遇到 不同類型的異常,並且需要 針對不同類型的異常,做出不同的響應,這個時候,就需要捕獲錯誤類型
  • 文法如下:
try:    # 嘗試執行的代碼    passexcept 錯誤類型1:    # 針對錯誤類型1,對應的代碼處理    passexcept (錯誤類型2, 錯誤類型3):    # 針對錯誤類型2 和 3 處理的代碼    passexcept Exception as result:    print("未知錯誤 %s" % result)
  • 當 Python 解譯器 拋出異常 時,最後一行錯誤資訊的第一個單詞,就是錯誤類型
異常類型捕獲演練 - - 要求使用者輸入整數

要求
1,提示使用者輸入一個整數
2,使用 8 除以使用者輸入的整數並且輸出

    try:        # 1,提示使用者輸入一個整數        num = int(input("輸入一個整數:"))        # 2,使用 ````8```` 除以使用者輸入的整數並且輸出        result = 8 / num            print(result)        except ZeroDivisionError:        print("除0錯誤")    except ValueError:        print("請輸入正確的整數")                # 結果呈現    輸入一個整數:0    除0錯誤    輸入一個整數:a    請輸入正確的整數
捕獲未知錯誤
  • 在開發時,要預判到所有可能出現的錯誤,還是有一定難度的
  • 如果希望程式 無論出現任何錯誤,都不會因為 python 解譯器 拋出異常而被終止,可以增加一個 except

  • 文法如下:

except Exception as result:    print("未知錯誤 %s" % result)
    try:        # 1,提示使用者輸入一個整數        num = int(input("輸入一個整數:"))        # 2,使用 ````8```` 除以使用者輸入的整數並且輸出        result = 8 / num            print(result)        # except ZeroDivisionError:    #     print("除0錯誤")    except ValueError:        print("請輸入正確的整數")    except Exception as result:        print("未知錯誤 %s " % result)            # 結果呈現    輸入一個整數:0    未知錯誤 division by zero 
2.3 異常捕獲完整文法
  • 在實際開發中,為了能夠處理複雜的異常情況,完整的異常文法如下:
try:    # 嘗試執行的代碼    passexcept 錯誤類型1:    # 針對錯誤類型1,對應的代碼處理    passexcept (錯誤類型2, 錯誤類型3):    # 針對錯誤類型2 和 3 處理的代碼    passexcept Exception as result:    print("未知錯誤 %s" % result)else:    # 沒有異常才會執行的代碼    passfinally:    # 無論是否有異常,都會執行的代碼    print("無論是否有異常,都會執行的代碼")    
  • else 只有在沒有異常時才會執行的代碼
  • finally 無論是否有異常,都會執行的代碼
    try:        # 1,提示使用者輸入一個整數        num = int(input("輸入一個整數:"))        # 2,使用 ````8```` 除以使用者輸入的整數並且輸出        result = 8 / num            print(result)        # except ZeroDivisionError:    #     print("除0錯誤")    except ValueError:        print("請輸入正確的整數")    except Exception as result:        print("未知錯誤 %s " % result)    else:        print("嘗試成功")    finally:        print("無論是否有異常,都會執行的代碼")        print("-" * 20)            # 結果呈現    輸入一個整數:q    請輸入正確的整數    無論是否有異常,都會執行的代碼    --------------------        輸入一個整數:0    未知錯誤 division by zero    無論是否有異常,都會執行的代碼    --------------------        輸入一個整數:1    8.0    嘗試成功    無論是否有異常,都會執行的代碼    --------------------
03,異常的傳遞
  • 異常的傳遞 - - 當 函數/方法 執行 出現異常 ,會 將異常傳遞 給 函數/方法 的 調用一方
  • 如果 傳遞到主程式,仍然 沒有異常處理,程式才會被終止

提示

  • 在開發中,可以在主函數中增加 異常捕獲
  • 而在主函數中調用的其它函數,只要出現異常,都會傳遞到主函數的 異常捕獲 中
  • 這樣就不需要在代碼中,增加大量的 異常捕獲,能夠保證代碼的整潔

需求
1,定義函數 demo1() 提示使用者輸入一個整數並且返回
2,定義函數 demo2() 調用 demo1()
3,在主程式中調用 demo2()

    def demo1():        return int(input("請輸入一個整數:"))        def demo2():        return demo1()        try:        print(demo2())    except Exception as result:        print("未知錯誤:%s" % result)                # 結果呈現    請輸入一個整數:q    未知錯誤:invalid literal for int() with base 10: ‘q‘
04,拋出 raise 異常4.1 應用情境
  • 在開發中,除了 代碼執行出錯 python 解譯器會 拋出 異常之外
  • 還可以根據 應用程式 特有的業務需求 主動拋出異常

樣本

  • 提示使用者 輸入密碼,如果 長度少於8,拋出 異常

注意

  • 當前函數 只負責 提示使用者輸入密碼,如果 密碼長度不正確,需要其它的函數做額外處理
  • 因此可以 拋出異常,有其它需要處理的函數 捕獲異常
4.2 拋出異常
  • python 中提供 了一個 Exception 異常類
  • 在開發時,如果滿足 特定業務需求時,希望 拋出異常,可以:
    • 建立 一個 Exception 的對象
    • 使用 raise 關鍵字 拋出 異常對象

需求

  • 定義 input_password 函數,提示使用者輸入密碼
  • 如果使用者輸入長度 < 8 ,拋出異常
  • 如果使用者輸入長度 >= 8 ,返回輸入的密碼
    def input_password():            # 1,提示使用者輸入密碼        pwd = input("請輸入密碼: ")        # 2, 如果使用者輸入長度 >= 8 ,返回輸入的密碼        if len(pwd) >= 8:            return pwd        # 3, 如果使用者輸入長度 < 8 ,拋出異常        print("主動拋出異常")        # 1> 建立異常對象 - 可以使用錯誤字串作為參數        ex = Exception("密碼長度不夠")        # 1> 主動拋出異常        raise ex            try:        print(input_password())    except Exception as  result:        print(result)                    # 結果呈現    請輸入密碼: 12345678    12345678            請輸入密碼: 123    主動拋出異常    密碼長度不夠

Python 物件導向 --- 異常

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.