> 백엔드 개발 > 파이썬 튜토리얼 > Python 자동 테스트에서 예외 처리 메커니즘을 구현하는 방법은 무엇입니까?

Python 자동 테스트에서 예외 처리 메커니즘을 구현하는 방법은 무엇입니까?

WBOY
풀어 주다: 2023-05-07 21:10:10
앞으로
969명이 탐색했습니다.

    1. 소개

    Python에서 예외의 도입, 캡처 및 처리와 관련된 지식 포인트를 주로 설명합니다.

    2. 예외 처리 모음

    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 절이 먼저 실행되고 다음 시나리오가 발생할 수 있습니다.

    시나리오 1: try 문을 실행할 때 예외가 발생하면 Python은 try로 다시 점프하여 예외와 일치하는 첫 번째 제외 절을 실행합니다. 예외 처리가 완료되면 코드를 계속 실행합니다.

    시나리오 2: try 문을 실행할 때 예외가 발생하고 일치하는 제외 절이 없으면 예외는 상위 try 또는 프로그램의 최상위 수준에 제출되며 프로그램은 여기서 종료되고 다음과 같은 오류 메시지가 표시됩니다. 인쇄되었습니다.

    시나리오 3: try 절이 실행될 때 예외가 발생하지 않으면 Python은 코드 문을 계속 실행합니다.

    예외 캡처의 원리를 이해한 후 이전 TypeError 오류를 해결하는 방법을 살펴보겠습니다. 문자 그대로의 의미는 정수를 문자열과 비교할 수 없다는 것입니다. 그러나 실제로는 이미 이 작업을 수행했습니다. 이전에 변수 age를 처리했지만 try 예외가 발생했기 때문에 try와 일치하는 첫 번째 Except 절이 실행되고 해당 절이 예외 문을 대체하므로 여기서 유형 변환은 유효하지 않으며 프로그램이 실행될 때 유형 오류가 발생합니다. 다시 실행해 보세요. 이 문제에 대한 해결책도 매우 간단합니다. try에 판단문을 넣으면 됩니다.

    try에 판단 문을 넣으면 약간 변경됩니다. 예외가 발생하지 않으면 프로그램은 평소와 같이 실행되고 예외가 발생하면 즉시 제외 실행 출력으로 이동합니다. 더 이상 판단 논리가 없으므로 TypeError 오류가 더 이상 발생하지 않습니다. 그런데 이것은 "하나 사면 하나 무료"라는 일반적인 개발 버그입니다. :

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

    Python 자동 테스트에서 예외 처리 메커니즘을 구현하는 방법은 무엇입니까?

    Python 자동 테스트에서 예외 처리 메커니즘을 구현하는 방법은 무엇입니까?

    Python 자동 테스트에서 예외 처리 메커니즘을 구현하는 방법은 무엇입니까?

    2.4 특정 예외 캡처

    이름에서 알 수 있듯이 특정 예외 캡처는 발생하는 특정 예외(예: 다른 예외 유형을 캡처하는 경우)를 캡처하는 것입니다. , 코드가 실행될 때 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으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿