1. 程式人生 > 其它 >elementUI驗證數字,input校驗數字型別

elementUI驗證數字,input校驗數字型別

技術標籤:practicepython

異常:

一、認識異常:

1.什麼是異常:

異常是指在程式執行過程中發生的異常事件,通常是由外部問題(如硬體錯誤、輸入錯誤)所導致的。注意異常與錯誤的區別:異常時程式執行的過程中出現的,而錯誤是編譯時產生的。廣義上,異常分為兩類Error和Except。

2.異常舉例

先看下面這段程式碼:

# 例1:
num01 =int(input("請輸入一個數字:"))
num02 =int(input("請輸入一個數字:"))
print(num01/num02)

# 例2: 
list01 = [11,22,33,44,55
,66] print(list01[8])

分析:
先說例1,例1在我們執行的過程中也許不會出錯,但是一旦我們給num01和num02傳入的是非數字,或者是給num02傳入0,程式會立馬報錯並停止執行,這是異常;再看例2,我們在編寫這段程式的時候,並沒有提示出錯,說明編譯沒有出錯,但是當我們執行這段程式碼後,會提示下標越界,這也是異常。

可能你會覺得這些錯誤很可笑,不會出錯,那是因為現在你所編寫的程式碼的長度和複雜度不夠,在足夠大的專案裡,裡邊可能會出現很多異常,而我們並不能及時的發現,更甚是還有一些異常是由於系統出現故障引起的。

二、解決異常的反法

1.條件選擇語句:

對於一些簡單的異常,我們可以採用條件選擇語句處理,就以上例中的例1為例:

num01 =input("請輸入被除數:")
num02 =input("請輸入除數:")
if num01.isdigit() and num02.isdigit():
    num01 = int(num01)
    num02 = int(num02)
    if num02 != 0:
        print("%d / %d = %.2f" % (num01,num02,num01/num02))
    else:
        print("除數為零,出現異常!")
else:
    print("輸入的資料不是整數!"
)

用這種方法只能解決異常大家庭中的極少數的異常。因此,我們也很少使用這種方法去處理異常。通常我們所說的異常處理包含兩類:

'''
 異常處理在程式碼中主要有兩種方式: 1. 異常捕獲   2. 丟擲異常
    異常捕獲有以下幾種方式:
        1. try  ---  except
        2. try  ---  except  ---  else
        3. try  ---  except  ---  finally
        4. try  ---  except  ---  else  --- finally
        
    丟擲異常:使用raise關鍵字來丟擲異常
'''

2. 捕獲異常

  • 使用try — except捕獲異常

    """
    # 使用方法:
    try:
        有可能出現異常的程式碼
    except:
        解決方法
    """
    # 案例:
    import traceback
    
    list01 = [11,22,33,44,55,66,7,8,9]
    try:
        print(list01[len(list01)])
    except Exception as e:
        print("訪問集合的元素出現異常!請聯絡管理員!")
        print(str(e))                   #反饋異常的基本資訊
        print(e)                        #反饋異常的基本資訊
        print(e.args[0])                #反饋異常的基本資訊
        print(repr(e))                  #反饋異常類和異常的基本資訊
        print(traceback.format_exc())   #獲取異常的詳細資訊
        traceback.print_exc(file = open(".txt","w"))
    
    # 執行結果:
    訪問集合的元素出現異常!請聯絡管理員!
    list index out of range
    list index out of range
    list index out of range
    IndexError('list index out of range')
    Traceback (most recent call last):
      File "D:/mypycharm/pythonProject/千峰培訓/day1/01_demo.py", line 80, in <module>
        print(list01[len(list01)])
    IndexError: list index out of range
    

    這種異常處理中,我們一般會採用最後一種,記錄異常資訊,因為有些程式我們不能時時刻刻的盯著,這種情況,採用這種方式,就會起到很好的效果。

在這裡插入圖片描述

  • 具體化異常處理函式

    """
    # 使用方法:
    try:
        有可能出現異常的程式碼
    except:
        解決方法
    else:
    	未出現異常執行的程式碼
    
    """
    import traceback
    
    str = True
    while str:
        try:
            num01 = int(input("請輸入被除數:"))
            num02 = int(input("請輸入除數:"))
            print("%d / %d = %.2f" % (num01, num02, num01 / num02))
            str = False
        except ValueError as e:
            print("輸入的不是整數!")
        except ZeroDivisionError as e:
            print("輸入的除數為零!")
        except Exception as e:
            print("未知的異常,具體檢視日誌!")
            traceback.print_exc(file= open("D:\mypycharm\systemlogError.txt","w"))
        else:
            print("程式正常執行,沒有出現異常!") 
    
  • 使用 try — except — finally 捕獲異常

    try:
        num01 = int(input("請輸入被除數:"))
        num02 = int(input("請輸入除數:"))
        print("%d / %d = %.2f" % (num01, num02, num01 / num02))
    except:
        print("程式碼出現異常!")
    finally:
        print("=== finally中的程式碼!===")
    

    執行程式碼:

    請輸入被除數:18
    請輸入除數:0
    程式碼出現異常!
    === finally中的程式碼!===
    請輸入被除數:18
    請輸入除數:3
    18 / 3 = 6.00
    程式正常執行,沒有出現異常!
    ====finally===
    

    注意: 無論try中程式碼是否異常,finally中的程式碼都會執行;finally程式碼主要對資源的回收:開啟檔案的關閉,或者開啟資料之後的關閉連線

    案例;

    try:
        global fd
        fd = open ("C:\\Users\\42079\\PycharmProjects\\testTT\\ystemlogError.txt",encoding="UTF-8")
        print(fd)
    except FileNotFoundError as e:
        print("檔案路徑或名字錯誤!")
    except UnicodeDecodeError as e:
        print("編碼無法識別!")
    except Exception as e:
        print("其他未知異常!")
    finally:
        fd.close()
    
  • 方法4: 使用 try — except — else — finally 捕獲異常

    while str:
        try:
            num01 = int(input("請輸入被除數:"))
            num02 = int(input("請輸入除數:"))
            print("%d / %d = %.2f" % (num01, num02, num01 / num02))
            str = False
        except ValueError as e:
            print("輸入的不是整數!")
        except ZeroDivisionError as e:
            print("輸入的除數為零!")
        except Exception as e:
            print("未知的異常,具體檢視日誌!")
            traceback.print_exc(file = open("C:\\Users\\42079\\PycharmProjects\\testTT\\ystemlogError.txt","w"))
        else:
            print("程式正常執行,沒有出現異常!")  # 未出現異常執行的程式碼
        finally:
            print("====finally===")
    

3. 丟擲異常:

案例: 對兩個0-10000之間的數進行運算

#  產生了異常,使用raise丟擲異常
def div(num01:int,num02:int):
    if num01 > 10000 or num01 < 0 or num02 > 10000 or num02 < 0:
        raise Exception("輸入的數不在範圍內!")  
    # 可以直接使用raise丟擲異常,也可以使用完整的丟擲異常的方法丟擲異常
    try:
        return num01/num02
    except ZeroDivisionError as e:
        raise e
        
if __name__ =='__main__':
    str01 = True
    while str01:
        try:
            num01= int((input("請輸入0-10000之間的整數:")))
            num02= int((input("請輸入0-10000之間的整數:")))
            print("%d / %d = %.2f" % (num01, num02, div(num01,num02)))
            str = False
            
        #  以下3中方式是接收方法中可能丟擲的異常
        except ValueError as e:
            print("輸入的數不是整數!")
        except ZeroDivisionError as e:
            print("輸入的除數為零!")
        except Exception as e:
            print(str(e))
        # 正確的程式碼,也就是不會出現異常的程式碼
        else:
             print("%d + %d = %d" % (num01, num02, num01 + num02))
             print("%d - %d = %d" % (num01, num02, num01 - num02))
             print("%d * %d = %d" % (num01, num02, num01 * num02))
             str01 = False
        print()
                
#  程式碼從主函式裡開始,自傷而下執行,先執行try中的程式碼塊,如果出現異常,就會丟擲異常,else內的程式碼不會執行,直到異常消除位為止。

執行結果:

請輸入一個0-10000之間的整數:10001
請輸入一個0-10000之間的整數:-1
輸入的數不在範圍內!

請輸入一個0-10000之間的整數:9999
請輸入一個0-10000之間的整數:0
輸入的除數為零!

請輸入一個0-10000之間的整數:9999
請輸入一個0-10000之間的整數:9999
9999 / 9999 = 1.00
9999 + 9999 = 19998
9999 - 9999 = 0
9999 * 9999 = 99980001

Process finished with exit code 0