前言:本文主要介紹python中異常的處理及斷言,包括異常類型、異常捕獲、主動跑出異常和斷言。python
什麼是異常?異常便是一個事件,該事件會在程序執行過程當中發生,會影響程序的正常執行,通常狀況下,在python沒法正常處理程序時就會發生一個異常。函數
異常是python對象,表示一個錯誤。當python腳本發生異常時咱們須要捕獲處理它,不然程序會終止執行。測試
在python 中,全部的異常都是派生自BaseException類的實例,下面介紹幾種常見幾種異常:spa
BaseException: 全部異常的基類3d
常見的Exception類異常類型舉例以下:code
還有更多的異常類型,有興趣的能夠查閱官網文檔或者百度查詢。orm
捕捉異常可使用try/except語句,若是你不想在異常發生時結束你的程序,只需在try裏捕獲它,使用except在錯誤發生後運行處理動做。對象
語法格式:(注意:except中指定異常類型,能夠指定一個也能夠指定多個,也能夠不指定,不指定時默認捕獲全部Exception類型的異常)blog
try:索引
可能出現異常的代碼
except 異常類型:
try: # try有可能發生異常的代碼 a = '這是一個測試異常的文本' print(b) except (NameError, FileNotFoundError): # 當捕獲到異常時處理的方案,能夠有多個except,不指定異常類型,會捕獲全部異常 print("這裏有一個異常!") # except NameError: 指定捕捉異常NameError,其餘的異常不會捕獲 # except Exception as msg: # 不肯定什麼異常異常,用exception,或者直接不指定 # print(msg) print(a)
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
這裏有一個異常!
這是一個測試異常的文本
Process finished with exit code 0
在try/except語句中可使用else和finally,try語句裏的代碼沒有異常纔會執行else裏的語句,而finally語句是無論try裏有沒有異常它都會執行
try: # try下面寫有可能會出現異常的代碼 score = int(input("請輸入成績:")) # 由於input獲取的都是字符串,int()是強制轉換成int類型,英文字符等是沒法轉換成int類型的字都會報錯 except Exception: # 處理異常以後的處理, print("用輸入的數據不符合規範,默認給0分") score = 0 else: # 代碼沒有出現異常,執行else中的代碼 print("代碼沒有出現異常,執行else") finally: # 無論代碼有沒有出現異常都會去執行的代碼 print("finally無論代碼有沒有出現異常都會去執行的代碼") print("分數錄入爲:{}".format(score))
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
請輸入成績:nine
用輸入的數據不符合規範,默認給0分
finally無論代碼有沒有出現異常都會去執行的代碼
分數錄入爲:0
Process finished with exit code 0
異常捕獲後爲何還要主動去拋出一個異常呢?這是爲了方便咱們知道出現異常的具體狀況,咱們還能夠自定義異常
語法格式:raise 異常類型(異常信息)
try: # try 有可能發生異常的代碼 a = 1111 print(b) except NameError as msg: print(msg) raise msg # 捕獲後運行不會報錯,再拋出就會看到異常 else: # try裏面的代碼都是正常執行,沒有發生任何異常,就會執行這裏 print("程序運行正常!") finally: print("無論有沒有異常,我都會被執行!")
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py name 'b' is not defined 無論有沒有異常,我都會被執行! Traceback (most recent call last): File "D:/learn/python18_http_request/exercise/test.py", line 15, in <module> raise msg # 捕獲後運行不會報錯,再拋出就會看到異常 File "D:/learn/python18_http_request/exercise/test.py", line 12, in <module> print(b) NameError: name 'b' is not defined Process finished with exit code 1
在自動化測試中,咱們只須要掌握如何捕獲異常如何拋出異常便可,自定義異常這裏就很少做解釋,有興趣的能夠自定百度。
什麼是斷言?其實assert斷言就是用於判斷一個表達式,在表達式條件爲 false 的時候觸發斷言異常,斷言能夠在條件不知足程序運行的狀況下直接返回錯誤,
而沒必要等待程序運行後出現崩潰的狀況,例如咱們的代碼只能在a>8時運行,能夠先判斷當前是否符合條件。語法格式以下:
assert 表達式,提示信息 (也能夠沒有提示信息)
# assert:斷言 res1 = {'code': 1, 'msg': '登錄成功'} res2 = {'code': 0, 'msg': '登錄失敗'} # 加一個斷言,判斷結果是否如預期,若是與預期不一致,會報出斷言異常並打印提示信息 assert res1 == res2, '該用例不經過!'
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py Traceback (most recent call last): File "D:/learn/python18_http_request/exercise/test.py", line 15, in <module> assert res1 == res2, '該用例不經過!' # 加一個斷言,判斷結果是否如預期,若是與預期不一致,會報出斷言異常並打印提示信息 AssertionError: 該用例不經過! Process finished with exit code 1
咱們也能夠用try/except來捕獲這個斷言異常:
# assert:斷言 res1 = {'code': 1, 'msg': '登錄成功'} res2 = {'code': 0, 'msg': '登錄失敗'} # 用try--except捕獲斷言異常 try: assert res1 == res2 except AssertionError as e: print("編號A1用例不經過!") raise e # 處理異常後,拋出異常 else: print("編號A1用例經過!")
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py 編號A1用例不經過! Traceback (most recent call last): File "D:/learn/python18_http_request/exercise/test.py", line 18, in <module> raise e # 處理異常後,拋出異常 File "D:/learn/python18_http_request/exercise/test.py", line 15, in <module> assert res1 == res2 AssertionError Process finished with exit code 1
做者:miki_peng
出處:https://www.cnblogs.com/miki-peng