Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

WBOY
WBOYke hadapan
2023-05-07 21:10:10902semak imbas

    1 Pengenalan

    Terutamanya menerangkan perkara pengetahuan yang berkaitan dengan pengenalan pengecualian, penangkapan dan pemprosesan dalam Python

    2

    2.1 Penjelasan Pengendalian Pengecualian

    Sebelum memperkenalkan pengendalian pengecualian secara rasmi, kita perlu terlebih dahulu membiarkan semua orang memahami konsep: pengaturcaraan adalah mustahil untuk menjadi sempurna, dan selalu ada situasi yang tidak boleh dipertimbangkan, kerana tiada siapa yang sempurna, manusia adalah cacat, apatah lagi bahawa pengaturcaraan dilakukan oleh manusia Dalam projek sebenar, jangan percaya apa yang dikatakan oleh sesiapa: Kod saya sempurna, dan pastinya tidak akan ada masalah dengan ini perkataan serupa, anda mesti tahu maksud pengaturcaraan Dalam dunia ini, tidak ada kebolehpercayaan yang mutlak.

    Semua orang juga harus sedar bahawa selagi program itu ditulis oleh orang, pasti akan ada masalah Jika program tidak dilaksanakan mengikut proses biasa, kami memanggilnya sebagai pengecualian namanya, adalah untuk menyelesaikan situasi abnormal ini Ia membolehkan program untuk melaksanakan secara normal mengikut logik dan aliran.

    2.2 Tangkapan Pengecualian

    Apabila program melaporkan ralat semasa pelaksanaan, ia akan menamatkan operasinya Jika kami menjalankannya semula selepas mengendalikan pengecualian, tidak akan ada lagi ralat tangkap ralat ini akan membolehkan atur cara berjalan dengan lancar Ini Proses pengendalian pengecualian dipanggil penangkapan pengecualian. kod di atas, apabila data input ialah 18, ia boleh diteruskan seperti biasa Pengiraan logik program membenarkan kod dilaksanakan secara normal sehingga tamat, tetapi adakah benar-benar tiada masalah dengan kod tersebut? Mari lihat contoh ini sekali lagi Apabila input adalah huruf Inggeris abc, ralat ValueError berlaku secara literal memberitahu kita bahawa ralat berangka telah berlaku dan rentetan tidak boleh ditukar kepada integer:

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

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

    Seperti yang ditunjukkan dalam gambar di atas, apabila ValueError berlaku, kita boleh mengendalikannya melalui penangkapan pengecualian Kod yang diproses ialah:

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

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

    Seperti yang ditunjukkan di atas. Seperti yang ditunjukkan dalam rajah, kami laksanakan semula program dan masukkan abc Program ini masih tidak dapat dijalankan lagi Ralat ValueError yang dilaporkan tadi.

    2.3 Prinsip penangkapan pengecualian Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

    Untuk menyelesaikan ralat TypeError di atas, mari kita fahami prinsip penangkapan pengecualian Apabila pernyataan cuba dimulakan secara rasmi, Python akan dalam konteks program semasa Buat tanda, dan kembali ke tanda apabila pengecualian berlaku Klausa cuba dilaksanakan terlebih dahulu, dan senario berikut mungkin berlaku:

    Senario 1: Jika pengecualian berlaku semasa melaksanakan pernyataan cuba, Python melompat ke belakang. untuk mencuba dan melaksanakan klausa kecuali An pertama yang sepadan dengan pengecualian, pengecualian dikendalikan dan pelaksanaan kod diteruskan.

    Senario 2: Jika pengecualian berlaku semasa melaksanakan pernyataan cuba dan tiada padanan kecuali klausa, pengecualian akan diserahkan kepada percubaan atas atau peringkat atas program ini akan berakhir di sini dan mesej ralat akan dicetak.

    Senario 3: Jika tiada pengecualian berlaku apabila klausa cuba dilaksanakan, Python akan terus melaksanakan pernyataan kod.

    Setelah kita memahami prinsip penangkapan pengecualian, mari kita lihat cara menyelesaikan ralat TypeError sebelumnya sudah melakukan ini sebelum ini Umur pembolehubah diproses, tetapi kerana pengecualian percubaan ditangkap, percubaan pemadanan klausa pertama dilaksanakan, dan klausa menggantikan pernyataan pengecualian, jadi penukaran jenis di sini tidak sah, dan program dijalankan semula . Ralat jenis akan berlaku, dan penyelesaiannya sangat mudah Anda hanya perlu meletakkan pernyataan penghakiman.

    Apabila pernyataan penghakiman diletakkan dalam percubaan, ia berubah sedikit Jika tiada pengecualian ditangkap, program akan dilaksanakan seperti biasa dan penghakiman akan berkuat kuasa, ia akan melompat terus ke kecuali output pelaksanaan untuk meminta anda Jika umur adalah menyalahi undang-undang, tidak akan ada logik penghakiman, jadi ralat TypeError tidak akan berlaku, ini adalah pepijat pembangunan biasa kami pengubahsuaian adalah seperti berikut:

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

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?2.4 Tangkapan pengecualian khusus

    Spesifik penangkapan pengecualian, seperti namanya, adalah untuk menyasarkan Catch tertentu pengecualian khusus yang berlaku, seperti ValueError yang kami temui Jika anda menangkap jenis pengecualian lain, ralat akan tetap berlaku jika ValueError ditemui apabila kod dilaksanakan: <.>rreeeeBagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

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

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

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik 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("万能捕手在此,束手就擒吧!")

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik 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}")

    Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?

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

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

    Atas ialah kandungan terperinci Bagaimana untuk melaksanakan mekanisme pengendalian pengecualian dalam ujian automatik Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam