溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

發(fā)布時(shí)間:2023-05-08 11:07:06 來(lái)源:億速云 閱讀:118 作者:zzz 欄目:編程語(yǔ)言

這篇文章主要介紹了怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

    一、前言

    主要講解Python中異常介紹、捕獲、處理相關(guān)知識(shí)點(diǎn)內(nèi)容

    二、異常處理合集

    2.1 異常處理講解

    在正式介紹異常處理之前,需要先讓大家了解一個(gè)概念:編程是不可能存在完美的,總有考慮不到的情況,因?yàn)槿藷o(wú)完人,人類(lèi)是有缺陷的,更何況編程是出自人類(lèi)之手,在真實(shí)項(xiàng)目中不要相信任何人所說(shuō)的:我的代碼是完美的、這個(gè)絕對(duì)不會(huì)有問(wèn)題類(lèi)似的話(huà),要知道在編程的世界里,沒(méi)有絕對(duì)的可靠。

    大家也應(yīng)該清楚了,只要是人所編寫(xiě)的程序就一定會(huì)存在問(wèn)題,程序不按照正常流程執(zhí)行,我們就稱(chēng)之為異常,異常處理顧名思義就是解決這種異常的情況,能夠讓程序正常按照邏輯和流程執(zhí)行。

    2.2 異常捕獲

    當(dāng)一個(gè)程序執(zhí)行報(bào)錯(cuò)時(shí)會(huì)終止運(yùn)行,我們進(jìn)行異常處理后再次運(yùn)行就不會(huì)再出現(xiàn)報(bào)錯(cuò),能夠捕獲到這個(gè)報(bào)錯(cuò)讓程序順利運(yùn)行,這個(gè)異常處理的過(guò)程我們稱(chēng)之為異常捕獲,讓我們先看一個(gè)例子:

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
     
    age = (input("請(qǐng)輸入您的年齡:"))
    age = int(age)
    if age < 18:
        print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
    else:
        print("恭喜您符合注冊(cè)條件")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    如上代碼所示,輸入的數(shù)據(jù)為18時(shí),能夠正常的進(jìn)行程序的邏輯計(jì)算,從而正常執(zhí)行代碼直至結(jié)束,但這樣的代碼真的沒(méi)有問(wèn)題嗎?我們?cè)倏催@個(gè)例子,當(dāng)輸入為abc英文字母時(shí),出現(xiàn)了ValueError的錯(cuò)誤,字面的意思是告訴我們出現(xiàn)了數(shù)值錯(cuò)誤,無(wú)法將字符串轉(zhuǎn)換為整型:

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
     
    age = (input("請(qǐng)輸入您的年齡:"))
    age = int(age)
    if age < 18:
        print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
    else:
        print("恭喜您符合注冊(cè)條件")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    如上圖所示,出現(xiàn)了ValueError報(bào)錯(cuò)時(shí),我們就可以通過(guò)異常捕獲進(jìn)行處理,處理后的代碼為:

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
    age = (input("請(qǐng)輸入您的年齡:"))
     
    try:
        age = int(age)
    except:
        print("您的年齡輸入非法,請(qǐng)重新運(yùn)行本程序")
     
    if age < 18:
        print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
    else:
        print("恭喜您符合注冊(cè)條件")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    如上圖所示,我們?cè)俅螆?zhí)行該程序并輸入abc,程序仍然無(wú)法運(yùn)行,已經(jīng)不是剛剛的ValueError報(bào)錯(cuò)了,現(xiàn)在的報(bào)錯(cuò)是TypeError報(bào)錯(cuò)。

    2.3 異常捕獲原理

    要解決上面的TypeError的報(bào)錯(cuò),我們先來(lái)了解下異常捕獲的原理,當(dāng)正式開(kāi)始一個(gè)try語(yǔ)句后,Python會(huì)在當(dāng)前程序的上下文中作標(biāo)記,當(dāng)異常出現(xiàn)時(shí)返回標(biāo)記處,try子句先執(zhí)行,后續(xù)可能會(huì)發(fā)生的場(chǎng)景:

    場(chǎng)景一: 如果執(zhí)行try語(yǔ)句時(shí)發(fā)生異常,Python跳回至try并執(zhí)行第一個(gè)匹配該異常的except子句,異常處理完畢,繼續(xù)執(zhí)行代碼。

    場(chǎng)景二: 如果執(zhí)行try語(yǔ)句時(shí)發(fā)生異常,且沒(méi)有匹配的except子句,異常將被遞交到上層的try或是程序的最上層,到此結(jié)束程序,打印錯(cuò)誤信息。

    場(chǎng)景三: 如果在try子句執(zhí)行時(shí)沒(méi)有發(fā)生異常,Python將繼續(xù)執(zhí)行代碼語(yǔ)句。

    當(dāng)我們了解了異常捕獲的原理后在來(lái)看下之前的TypeError報(bào)錯(cuò)如何解決,字面意思類(lèi)型錯(cuò)誤,整型無(wú)法與字符串進(jìn)行比較,但實(shí)際上在此之前我們就已經(jīng)對(duì)變量age進(jìn)行了處理,但因?yàn)椴东@到了try的異常,執(zhí)行了第一個(gè)匹配try的except子句,而子句又代替異常的語(yǔ)句,故此這里的類(lèi)型轉(zhuǎn)換就失效了,再次進(jìn)行程序的運(yùn)行就會(huì)出現(xiàn)類(lèi)型錯(cuò)誤,解決這個(gè)辦法也很簡(jiǎn)單,只需要把判斷語(yǔ)句也放在try中。

    當(dāng)判斷語(yǔ)句放到try中就稍微改變了一點(diǎn)點(diǎn),如果沒(méi)有捕獲異常,程序照常執(zhí)行,判斷會(huì)生效,如果捕獲到了異常,那么會(huì)直接跳轉(zhuǎn)到except執(zhí)行輸出,提示您的年齡非法,就不會(huì)在有判斷的邏輯,因此也不會(huì)在出現(xiàn)TypeError的錯(cuò)誤了,順帶一提,這就是我們常見(jiàn)的開(kāi)發(fā)Bug “買(mǎi)一送一” ,二次修改的代碼如下:

    # 程序仍然有可優(yōu)化的地方,僅展示try.. except語(yǔ)句的使用方式
    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
    age = (input("請(qǐng)輸入您的年齡:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
        else:
            print("恭喜您符合注冊(cè)條件")
    except:
        print("您的年齡輸入非法,請(qǐng)重新運(yùn)行本程序")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    2.4 特定異常捕獲

    特定異常捕獲顧名思義就是針對(duì)某一個(gè)出現(xiàn)的特定異常進(jìn)行捕獲,例如我們所遇到的ValueError,如果你捕獲的是其他異常類(lèi)型,那么在代碼執(zhí)行時(shí)碰到了ValueError仍然會(huì)出現(xiàn)報(bào)錯(cuò):

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
    age = (input("請(qǐng)輸入您的年齡:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
        else:
            print("恭喜您符合注冊(cè)條件")
    # 這里進(jìn)行捕獲的異常類(lèi)型是IndexError,非ValueError,最后的結(jié)果仍然會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有成功捕獲
    except IndexError:
        print("您的年齡輸入非法,請(qǐng)重新運(yùn)行本程序")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    當(dāng)捕獲的類(lèi)型錯(cuò)誤時(shí),仍然會(huì)彈出報(bào)錯(cuò)終止程序運(yùn)行,好比一個(gè)人酒駕,那么就應(yīng)該由交警處理而不是民政局的人處理,因?yàn)槟遣皇撬穆氊?zé),異常捕獲還要講究對(duì)口,如下代碼所示,如果設(shè)置成ValueError就能夠成功進(jìn)行捕獲,就好比交警處理了酒駕一樣,完美解決:

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
    age = (input("請(qǐng)輸入您的年齡:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
        else:
            print("恭喜您符合注冊(cè)條件")
    except ValueError:
        print("您的年齡輸入非法,請(qǐng)重新運(yùn)行本程序")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    2.5 異常捕獲的處理

    剛剛我們舉了一個(gè)例子,當(dāng)異常捕獲為IndexError時(shí),運(yùn)行程序后仍然會(huì)出現(xiàn)ValueError的錯(cuò)誤,但我們不設(shè)置直接使用except時(shí)反而能直接捕獲,那我們還要設(shè)置它做什么呢?想必有部分同學(xué)心中已經(jīng)會(huì)產(chǎn)生這樣的疑問(wèn)了。

    except可以理解為萬(wàn)能警察,萬(wàn)能捕手,它可以捕獲所有的異常類(lèi)型(極少數(shù)無(wú)法直接捕獲),而特定的異常捕獲只能捕獲特定出現(xiàn)的異常情況,我們之所以還要使用,是因?yàn)樗菍?zhuān)門(mén)捕獲一種類(lèi)型的,好比一個(gè)人有皮膚問(wèn)題,那么肯定是掛皮膚科門(mén)診要比急診科的醫(yī)生要更加專(zhuān)業(yè),正所謂術(shù)業(yè)有專(zhuān)攻。

    except因?yàn)槭侨f(wàn)能捕手,所以它在抓獲異常后的處理方式是一樣的,好比感冒和心臟病發(fā)作兩種癥狀,都是同樣的對(duì)待方式顯然是不合理的,那么這個(gè)時(shí)候就會(huì)由特定的“醫(yī)生” (特定捕獲) 進(jìn)行對(duì)應(yīng)的處理方式。

    目前常見(jiàn)的一些報(bào)錯(cuò)有:ValueError、TypeError、IndexError等等,那么在整個(gè)自動(dòng)化測(cè)試的過(guò)程中,勢(shì)必會(huì)遇到很多其他的報(bào)錯(cuò),當(dāng)我們不清楚其他報(bào)錯(cuò)的情況下如何進(jìn)行異常捕獲呢??jī)煞N方式,第一種是錯(cuò)過(guò)一次就記得了,好比一開(kāi)始進(jìn)行編程的小伙伴們,誰(shuí)也不知道會(huì)遇到ValueError一樣,當(dāng)碰到過(guò)一次后,下一次就會(huì)特別注意這個(gè)事情,提前做一個(gè)捕獲,俗稱(chēng)踩坑。那另外一種方式就是在末尾繼續(xù)添加except,萬(wàn)能捕手我們也留著,這樣當(dāng)特定捕獲沒(méi)有捕獲到異常但程序出現(xiàn)了異常時(shí),except就會(huì)進(jìn)行捕獲:

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
    age = (input("請(qǐng)輸入您的年齡:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
        else:
            print("恭喜您符合注冊(cè)條件")
    # 這里會(huì)報(bào)錯(cuò)ValueError,因?yàn)椴东@的類(lèi)型是IndexError,很明顯無(wú)法進(jìn)行ValueError異常捕獲,那么我們可以在添加一個(gè)萬(wàn)能捕手except來(lái)進(jìn)行捕獲
    except IndexError:
        print("您的年齡輸入非法,請(qǐng)重新運(yùn)行本程序")
    # 在下面可以在進(jìn)行一個(gè)except的添加:
    except:
        print("萬(wàn)能捕手在此,束手就擒吧!")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    2.6 except、Exception與BaseException

    except我們知道了是萬(wàn)能捕手,但其實(shí)它的身份是Exception,Python默認(rèn)幫我們省略了,實(shí)際上它是這樣的:

    except Exception:
        print("萬(wàn)能捕手在此,束手就擒吧!")

    except與except Exception完全等價(jià),日常的編寫(xiě)時(shí)可加可不加,依據(jù)個(gè)人習(xí)慣和喜好決定即可。而B(niǎo)aseException是Exception的父類(lèi),作為子類(lèi)的Exception無(wú)法截獲父類(lèi)BaseException類(lèi)型的錯(cuò)誤。

    BaseException: 包含所有built-in exceptions

    Exception: 不包含所有的built-in exceptions,只包含built-in, non-system-exiting exceptions,像SystemExit類(lèi)型的exception就不包含在其中。Python所有的錯(cuò)誤都是從BaseException類(lèi)派生的

    2.7 finally用法

    finally的作用是無(wú)論except是否成功捕獲到了對(duì)應(yīng)的異常,均需要執(zhí)行finally下的代碼:

    """
    參考如下代碼:打開(kāi)了love.txt這個(gè)文件,進(jìn)行了閱讀,又想寫(xiě)入一點(diǎn)東西,但現(xiàn)在是只讀的模式,無(wú)法進(jìn)行內(nèi)容寫(xiě)入,故此會(huì)報(bào)錯(cuò)io.UnsupportedOperation
    雖然沒(méi)有寫(xiě)入成功,但是這個(gè)文件是成功讀取了的,那么在文件的章節(jié)中提到過(guò),如果打開(kāi)了一個(gè)文件要記得關(guān)閉,否則其他人無(wú)法使用
    所以在finally這里我們就可以加上f.close(),代表著無(wú)論是否有捕捉到異常,最后我都要關(guān)閉這個(gè)文件,以確保其他人能夠正常使用該文件
    """
     
    import io
     
    try:
        f = open("love.txt", encoding="utf-8", mode="r")
        f.read()
        f.write("隨便寫(xiě)點(diǎn)~")
    except io.UnsupportedOperation:
        print("抓的就是你這個(gè)io.UnsupportedOperation報(bào)錯(cuò)")
    finally:
        # finally的作用是無(wú)論except是否成功捕獲到了對(duì)應(yīng)的異常,均需要執(zhí)行finally下的代碼
        f.close()
    2.8 異常信息的打印輸出

    雖然我們能夠捕獲異常,但我們肯定要了解到底是什么異常,在捕獲到一個(gè)異常時(shí)我們可以進(jìn)行異常信息的打?。?/p>

    print("------------------- 歡迎來(lái)到報(bào)名注冊(cè)系統(tǒng) -------------------")
    age = (input("請(qǐng)輸入您的年齡:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遺憾,您暫時(shí)不滿(mǎn)足注冊(cè)條件")
        else:
            print("恭喜您符合注冊(cè)條件")
    # 這里會(huì)報(bào)錯(cuò)ValueError,捕獲的是IndexError,很明顯無(wú)法進(jìn)行異常捕獲,那么我們可以在添加一個(gè)萬(wàn)能捕手except來(lái)進(jìn)行捕獲
    except IndexError as error:
        print("您的年齡輸入非法,請(qǐng)重新運(yùn)行本程序")
    # 在這里加一個(gè)as,后面接一個(gè)變量,然后進(jìn)行變量打印即可,當(dāng)出現(xiàn)對(duì)應(yīng)的異常時(shí)就會(huì)打印對(duì)應(yīng)異常的信息
    except Exception as error:
        print("萬(wàn)能捕手在此,束手就擒吧!", f"已捕獲異常:{error}")

    怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制

    剛剛有提到except與except Exception是等價(jià)的,但是如果想使用as必須要使用后者,這是語(yǔ)法規(guī)定:

    # 正確用法,在捕獲類(lèi)型后加as 變量
    except Exception as error:
        print("萬(wàn)能捕手在此,束手就擒吧!", f"已捕獲異常:{error}")
     
    # 錯(cuò)誤的用法,不符合語(yǔ)法規(guī)則
    except as error:
        print("萬(wàn)能捕手在此,束手就擒吧!", f"已捕獲異常:{error}")

    關(guān)于“怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“怎么在Python自動(dòng)化測(cè)試中實(shí)現(xiàn)異常處理機(jī)制”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI