ホームページ  >  記事  >  バックエンド開発  >  Python 自動テストで例外処理メカニズムを実装するにはどうすればよいですか?

Python 自動テストで例外処理メカニズムを実装するにはどうすればよいですか?

WBOY
WBOY転載
2023-05-07 21:10:10902ブラウズ

    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 に一致する最初の else 句が実行され、その句が例外ステートメントを置き換えるため、ここでの型変換は無効となり、プログラムが再度実行されます。 . 型エラーが発生しますが、解決方法は非常に簡単で、tryに判定文を入れるだけです。

    try に判定文を入れると少し変化します。例外がキャッチされなければ通常通り実行され判定が有効になります。例外がキャッチされた場合は直接ジャンプします。ただし、実行出力とプロンプトは表示されません。年齢が不正な場合、判定ロジックは存在しないため、TypeError エラーは発生しません。ちなみに、これはよくある開発バグです。「1 つ買えばもう 1 つ無料」というバグです。変更は次のとおりです。

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

    Python 自動テストで例外処理メカニズムを実装するにはどうすればよいですか?

    Python 自動テストで例外処理メカニズムを実装するにはどうすればよいですか?

    Python 自動テストで例外処理メカニズムを実装するにはどうすればよいですか?##2.4 特定の例外のキャプチャ

    特定の例外名前が示すように、キャプチャは、発生した特定の例外 (発生した ValueError など) をターゲットにします。他の例外タイプをキャッチした場合でも、コードの実行時に ValueError が発生するとエラーが発生します。 ##rree

    当捕获的类型错误时,仍然会弹出报错终止程序运行,好比一个人酒驾,那么就应该由交警处理而不是民政局的人处理,因为那不是它的职责,异常捕获还要讲究对口,如下代码所示,如果设置成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 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。