如何在Python自動化測試中實現異常處理機制?

WBOY
發布: 2023-05-07 21:10:10
轉載
963 人瀏覽過

    一、前言

    主要講解Python中異常介紹、捕獲、處理相關知識點內容

    二、異常處理集

    2.1 異常處理講解

    在正式介紹異常處理之前,需要先讓大家了解一個概念:程式設計是不可能存在完美的,總有考慮不到的情況,因為人無完人,人類是有缺陷的,更何況程式設計是出自人類之手,在真實專案中不要相信任何人所說的:我的程式碼是完美的、這個絕對不會有問題類似的話,要知道在程式設計的世界裡,沒有絕對的可靠。

    大家也應該清楚了,只要是人所寫的程式就一定會存在問題,程式不依照正常流程執行,我們就稱之為異常,異常處理顧名思義就是解決這種異常的情況,能夠讓程式正常按照邏輯和流程執行。

    2.2 異常捕獲

    當一個程式執行報錯時會終止運行,我們進行異常處理後再次運行就不會再出現報錯,能夠捕獲到這個報錯讓程式順利運行,這個異常處理的過程我們稱之為異常捕獲,讓我們先看一個例子:

    print("------------------- 欢迎来到报名注册系统 -------------------")
     
    age = (input("请输入您的年龄:"))
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
    登入後複製
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    #如上碼所示,輸入的資料為18時,能夠正常的進行程式的邏輯計算,從而正常執行程式碼直到結束,但這樣的程式碼真的沒有問題嗎?我們再看這個例子,當輸入為abc英文字母時,出現了ValueError的錯誤,字面的意思是告訴我們出現了數值錯誤,無法將字串轉換為整數:

    print("------------------- 欢迎来到报名注册系统 -------------------")
     
    age = (input("请输入您的年龄:"))
    age = int(age)
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
    登入後複製
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    如上圖所示,出現了ValueError報錯誤時,我們就可以透過例外擷取來處理,處理後的程式碼為:

    print("------------------- 欢迎来到报名注册系统 -------------------")
    age = (input("请输入您的年龄:"))
     
    try:
        age = int(age)
    except:
        print("您的年龄输入非法,请重新运行本程序")
     
    if age < 18:
        print("很遗憾,您暂时不满足注册条件")
    else:
        print("恭喜您符合注册条件")
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    如上圖所示,我們再次執行程式並輸入abc,程式仍然無法運行,已經不是剛剛的ValueError報錯了,現在的報錯是TypeError報錯。

    2.3 異常捕獲原理

    要解決上面的TypeError的報錯,我們先來了解下異常捕獲的原理,當正式開始一個try語句後,Python會在當前程序的上下文中作標記,當異常出現時返回標記處,try子句先執行,後續可能會發生的場景:

    場景一: 如果執行try語句時發生異常,Python跳回至try並執行第一個符合該異常的except子句,異常處理完畢,繼續執行程式碼。

    場景二: 如果執行try語句時發生異常,且沒有符合的except子句,異常將被遞交到上層的try或是程式的最上層,到此結束程序,列印錯誤訊息。

    場景三: 若在try子句執行時沒有發生異常,Python將繼續執行程式碼語句。

    當我們了解了異常捕獲的原理後在來看下之前的TypeError報錯如何解決,字面意思類型錯誤,整型無法與字符串進行比較,但實際上在此之前我們就已經對變數age進行了處理,但因為捕獲了try的異常,執行了第一個匹配try的except子句,而子句又代替異常的語句,故此這裡的類型轉換就失效了,再次進行程序的運行就會出現類型錯誤,解決這個辦法也很簡單,只要要把判斷語句也放在try中。

    當判斷語句放到try中就稍微改變了一點點,如果沒有捕獲異常,程式照常執行,判斷會生效,如果捕獲到了異常,那麼會直接跳到except執行輸出,提示您的年齡非法,就不會在有判斷的邏輯,因此也不會在出現TypeError的錯誤了,順帶一提,這就是我們常見的開發Bug “買一送一” ,二次修改的代碼如下:

    # 程序仍然有可优化的地方,仅展示try.. except语句的使用方式
    print("------------------- 欢迎来到报名注册系统 -------------------")
    age = (input("请输入您的年龄:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遗憾,您暂时不满足注册条件")
        else:
            print("恭喜您符合注册条件")
    except:
        print("您的年龄输入非法,请重新运行本程序")
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    如何在Python自動化測試中實現異常處理機制?

    如何在Python自動化測試中實現異常處理機制?

    #2.4 特定異常捕獲

    特定異常捕獲顧名思義就是針對某一個出現的特定異常進行捕獲,例如我們所遇到的ValueError,如果你捕獲的是其他異常類型,那麼在程式碼執行時碰到了ValueError仍然會出現報錯:

    print("------------------- 欢迎来到报名注册系统 -------------------")
    age = (input("请输入您的年龄:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遗憾,您暂时不满足注册条件")
        else:
            print("恭喜您符合注册条件")
    # 这里进行捕获的异常类型是IndexError,非ValueError,最后的结果仍然会报错,因为没有成功捕获
    except IndexError:
        print("您的年龄输入非法,请重新运行本程序")
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    #

    当捕获的类型错误时,仍然会弹出报错终止程序运行,好比一个人酒驾,那么就应该由交警处理而不是民政局的人处理,因为那不是它的职责,异常捕获还要讲究对口,如下代码所示,如果设置成ValueError就能够成功进行捕获,就好比交警处理了酒驾一样,完美解决:

    print("------------------- 欢迎来到报名注册系统 -------------------")
    age = (input("请输入您的年龄:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遗憾,您暂时不满足注册条件")
        else:
            print("恭喜您符合注册条件")
    except ValueError:
        print("您的年龄输入非法,请重新运行本程序")
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    2.5 异常捕获的处理

    刚刚我们举了一个例子,当异常捕获为IndexError时,运行程序后仍然会出现ValueError的错误,但我们不设置直接使用except时反而能直接捕获,那我们还要设置它做什么呢?想必有部分同学心中已经会产生这样的疑问了。

    except可以理解为万能警察,万能捕手,它可以捕获所有的异常类型(极少数无法直接捕获),而特定的异常捕获只能捕获特定出现的异常情况,我们之所以还要使用,是因为它是专门捕获一种类型的,好比一个人有皮肤问题,那么肯定是挂皮肤科门诊要比急诊科的医生要更加专业,正所谓术业有专攻。

    except因为是万能捕手,所以它在抓获异常后的处理方式是一样的,好比感冒和心脏病发作两种症状,都是同样的对待方式显然是不合理的,那么这个时候就会由特定的“医生” (特定捕获) 进行对应的处理方式。

    目前常见的一些报错有:ValueError、TypeError、IndexError等等,那么在整个自动化测试的过程中,势必会遇到很多其他的报错,当我们不清楚其他报错的情况下如何进行异常捕获呢?两种方式,第一种是错过一次就记得了,好比一开始进行编程的小伙伴们,谁也不知道会遇到ValueError一样,当碰到过一次后,下一次就会特别注意这个事情,提前做一个捕获,俗称踩坑。那另外一种方式就是在末尾继续添加except,万能捕手我们也留着,这样当特定捕获没有捕获到异常但程序出现了异常时,except就会进行捕获:

    print("------------------- 欢迎来到报名注册系统 -------------------")
    age = (input("请输入您的年龄:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遗憾,您暂时不满足注册条件")
        else:
            print("恭喜您符合注册条件")
    # 这里会报错ValueError,因为捕获的类型是IndexError,很明显无法进行ValueError异常捕获,那么我们可以在添加一个万能捕手except来进行捕获
    except IndexError:
        print("您的年龄输入非法,请重新运行本程序")
    # 在下面可以在进行一个except的添加:
    except:
        print("万能捕手在此,束手就擒吧!")
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    2.6 except、Exception与BaseException

    except我们知道了是万能捕手,但其实它的身份是Exception,Python默认帮我们省略了,实际上它是这样的:

    except Exception:
        print("万能捕手在此,束手就擒吧!")
    登入後複製

    except与except Exception完全等价,日常的编写时可加可不加,依据个人习惯和喜好决定即可。而BaseException是Exception的父类,作为子类的Exception无法截获父类BaseException类型的错误。

    BaseException: 包含所有built-in exceptions

    Exception: 不包含所有的built-in exceptions,只包含built-in, non-system-exiting exceptions,像SystemExit类型的exception就不包含在其中。Python所有的错误都是从BaseException类派生的

    2.7 finally用法

    finally的作用是无论except是否成功捕获到了对应的异常,均需要执行finally下的代码:

    """
    参考如下代码:打开了love.txt这个文件,进行了阅读,又想写入一点东西,但现在是只读的模式,无法进行内容写入,故此会报错io.UnsupportedOperation
    虽然没有写入成功,但是这个文件是成功读取了的,那么在文件的章节中提到过,如果打开了一个文件要记得关闭,否则其他人无法使用
    所以在finally这里我们就可以加上f.close(),代表着无论是否有捕捉到异常,最后我都要关闭这个文件,以确保其他人能够正常使用该文件
    """
     
    import io
     
    try:
        f = open("love.txt", encoding="utf-8", mode="r")
        f.read()
        f.write("随便写点~")
    except io.UnsupportedOperation:
        print("抓的就是你这个io.UnsupportedOperation报错")
    finally:
        # finally的作用是无论except是否成功捕获到了对应的异常,均需要执行finally下的代码
        f.close()
    登入後複製

    2.8 异常信息的打印输出

    虽然我们能够捕获异常,但我们肯定要了解到底是什么异常,在捕获到一个异常时我们可以进行异常信息的打印:

    print("------------------- 欢迎来到报名注册系统 -------------------")
    age = (input("请输入您的年龄:"))
     
    try:
        age = int(age)
        if age < 18:
            print("很遗憾,您暂时不满足注册条件")
        else:
            print("恭喜您符合注册条件")
    # 这里会报错ValueError,捕获的是IndexError,很明显无法进行异常捕获,那么我们可以在添加一个万能捕手except来进行捕获
    except IndexError as error:
        print("您的年龄输入非法,请重新运行本程序")
    # 在这里加一个as,后面接一个变量,然后进行变量打印即可,当出现对应的异常时就会打印对应异常的信息
    except Exception as error:
        print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")
    登入後複製

    如何在Python自動化測試中實現異常處理機制?

    刚刚有提到except与except Exception是等价的,但是如果想使用as必须要使用后者,这是语法规定:

    # 正确用法,在捕获类型后加as 变量
    except Exception as error:
        print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")
     
    # 错误的用法,不符合语法规则
    except as error:
        print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")
    登入後複製

    以上是如何在Python自動化測試中實現異常處理機制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板