python基礎(十四) - 異常的處理及斷言


 

前言:本文主要介紹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 異常類型:

  捕獲到異常之后的處理方案

上述例子中因為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

 

三、主動拋出異常


異常捕獲后為什么還要主動去拋出一個異常呢?這是為了方便我們知道出現異常的具體情況,我們還可以自定義異常

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM