前言:本文主要介紹python中異常的處理及斷言,包括異常類型、異常捕獲、主動跑出異常和斷言。
一、異常類型介紹
什么是異常?異常即是一個事件,該事件會在程序執行過程中發生,會影響程序的正常執行,一般情況下,在python無法正常處理程序時就會發生一個異常。異常是python對象,表示一個錯誤。當python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。
在python 中,所有的異常都是派生自BaseException類的實例,BaseException是所有異常的基類,下面四種是最常見的異常:
- SystemExit 解釋器請求退出
- KeyboardInterrupt 用戶中斷執行(通常是輸入^C)
- GeneratorExit 生成器(generator)發生異常來通知退出
- Exception 常規錯誤的基類
我們需要重點掌握Exception類,一般因代碼引起的錯誤,是我們可以控制的,其他異常基類我們了解即可,常見的Exception類異常類型舉例如下:
- AttributeError:屬性錯誤,特性引用和賦值失敗時會引發屬性錯誤
- NameError:試圖訪問的變量名不存在
- SyntaxError:語法錯誤,代碼形式錯誤
- IOError:一般常見於打開不存在文件時會引發IOError錯誤,也可以解理為輸出輸入錯誤
- KeyError:使用了映射中不存在的關鍵字(鍵)時引發的關鍵字錯誤
- IndexError:索引錯誤,使用的索引不存在,常索引超出序列范圍,什么是索引
- TypeError:類型錯誤,內建操作或是函數應於在了錯誤類型的對象時會引發類型錯誤
- ZeroDivisonError:除數為0,在用除法操作時,第二個參數為0時引發了該錯誤
- ValueError:值錯誤,傳給對象的參數類型不正確,像是給int()函數傳入了字符串數據類型的參數。
還有更多的異常類型,有興趣的可以查閱官網文檔或者百度查詢。
二、異常捕獲
1.try/except語法格式
捕捉異常可以使用try/except語句,如果你不想在異常發生時結束你的程序,只需在try里捕獲它,使用except在錯誤發生后運行處理動作。語法格式如下:(注意:except中指定異常類型,可以指定一個也可以指定多個,也可以不指定,不指定時默認捕獲所有Exception類型的異常)
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
2.異常處理中的else和finally
在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
什么是斷言?其實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