1四、python異常處理及斷言

 

前言:本文主要介紹python中異常的處理及斷言,包括異常類型、異常捕獲、主動跑出異常和斷言。python

 

1、異常類型介紹


  什麼是異常?異常便是一個事件,該事件會在程序執行過程當中發生,會影響程序的正常執行,通常狀況下,在python沒法正常處理程序時就會發生一個異常。函數

異常是python對象,表示一個錯誤。當python腳本發生異常時咱們須要捕獲處理它,不然程序會終止執行。測試

 

在python 中,全部的異常都是派生自BaseException類的實例,下面介紹幾種常見幾種異常:spa

BaseException:  全部異常的基類3d

  • SystemExit              解釋器請求退出
  • KeyboardInterrupt      用戶中斷執行(一般是輸入^C)
  • GeneratorExit            生成器(generator)發生異常來通知退出
  • Exception               常規錯誤的基類(重點掌握,通常因代碼引發的錯誤,是咱們能夠控制的,其餘異常基類咱們瞭解便可)

常見的Exception類異常類型舉例以下:code

  • AttributeError:屬性錯誤,特性引用和賦值失敗時會引起屬性錯誤
  • NameError:試圖訪問的變量名不存在
  • SyntaxError:語法錯誤,代碼形式錯誤
  • IOError:通常常見於打開不存在文件時會引起IOError錯誤,也能夠解理爲輸出輸入錯誤
  • KeyError:使用了映射中不存在的關鍵字(鍵)時引起的關鍵字錯誤
  • IndexError:索引錯誤,使用的索引不存在,常索引超出序列範圍,什麼是索引
  • TypeError:類型錯誤,內建操做或是函數應於在了錯誤類型的對象時會引起類型錯誤
  • ZeroDivisonError:除數爲0,在用除法操做時,第二個參數爲0時引起了該錯誤
  • ValueError:值錯誤,傳給對象的參數類型不正確,像是給int()函數傳入了字符串數據類型的參數。

還有更多的異常類型,有興趣的能夠查閱官網文檔或者百度查詢。orm

 

2、異常捕獲


 1.try/except語法格式

  捕捉異常可使用try/except語句,若是你不想在異常發生時結束你的程序,只需在try裏捕獲它,使用except在錯誤發生後運行處理動做。對象

語法格式:(注意:except中指定異常類型,能夠指定一個也能夠指定多個,也能夠不指定,不指定時默認捕獲全部Exception類型的異常)blog

try:索引

  可能出現異常的代碼

except 異常類型:

  捕獲到異常以後的處理方案

上述例子中由於b沒有被定義,在打印時沒法找到b,所以拋出了一個NameError致使後面的代碼沒法繼續執行,那麼咱們來捕獲一下這個錯誤

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

 

3、主動拋出異常


 異常捕獲後爲何還要主動去拋出一個異常呢?這是爲了方便咱們知道出現異常的具體狀況,咱們還能夠自定義異常

語法格式: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

在自動化測試中,咱們只須要掌握如何捕獲異常如何拋出異常便可,自定義異常這裏就很少做解釋,有興趣的能夠自定百度。

 

4、斷言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

 

 

做者:miki_peng

出處:https://www.cnblogs.com/miki-peng

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,請你們尊重原創,如要轉載,請在文章頁面明顯位置註明出處,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索