Maison > Article > développement back-end > Comment implémenter un mécanisme de gestion des exceptions dans les tests automatisés Python ?
Explique principalement les points de connaissances liés à l'introduction, à la capture et au traitement des exceptions en Python
Avant d'introduire formellement la gestion des exceptions, nous devons faites savoir à tout le monde Comprendre un concept : il est impossible d'être parfait en programmation. Il y a toujours des situations qui ne peuvent pas être prises en considération, car personne n'est parfait et les humains ont des défauts, sans compter que la programmation est faite par des humains. faites confiance à n'importe qui dans de vrais projets. Ce que j'ai dit : Mon code est parfait et il n'y aura certainement aucun problème avec lui. Vous devez savoir que dans le monde de la programmation, il n'y a pas de fiabilité absolue.
Tout le monde doit également être conscient que tant que le programme est écrit par des personnes, il y aura certainement des problèmes. Si le programme ne s'exécute pas selon le processus normal, nous appelons cela une gestion des exceptions, comme son nom l'indique. est de résoudre cette situation anormale et de rendre le programme normal.
Lorsqu'un programme s'exécute et signale une erreur, il mettra fin à son fonctionnement. Après avoir traité l'exception et l'avoir réexécuté, l'erreur n'apparaîtra plus. La possibilité de capturer cette erreur permet au programme de s'exécuter. en douceur. Nous appelons ce processus de gestion des exceptions Capture d'exception, regardons d'abord un exemple :
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件")
Comme le montre le code ci-dessus, lorsque les données d'entrée sont 18, le calcul logique du programme peut être effectué normalement, et le code peut être exécuté normalement jusqu'à la fin, mais un tel code n'est vraiment pas un problème ? Regardons à nouveau cet exemple. Lorsque l'entrée est constituée de lettres anglaises abc, une erreur ValueError se produit. Elle nous indique littéralement qu'une erreur numérique s'est produite et que la chaîne ne peut pas être convertie en un type entier :
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件")
Comme le montre l'exemple ci-dessous. Dans l'image ci-dessus, lorsqu'une ValueError se produit, nous pouvons la gérer via la capture d'exception. Le code traité est :
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) try: age = int(age) except: print("您的年龄输入非法,请重新运行本程序") if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件")
Comme le montre l'image ci-dessus, nous exécutons à nouveau le programme et entrons abc. Le programme ne peut toujours pas s'exécuter. Ce n'est plus la même chose qu'avant. L'erreur ValueError a été signalée et l'erreur actuelle est une erreur TypeError.
Pour résoudre l'erreur TypeError ci-dessus, comprenons d'abord le principe de capture d'exception Lorsqu'une instruction try est officiellement lancée, Python marquera le contexte du programme en cours et reviendra lorsqu'une exception se produit. la marque, la clause try est exécutée en premier et les scénarios suivants peuvent se produire :
Scénario 1 : si une exception se produit lors de l'exécution de l'instruction try, Python revient en arrière pour essayer et exécute la première clause except qui correspond à l'exception, et la l'exception est gérée, continuez à exécuter le code.
Scénario 2 : Si une exception se produit lors de l'exécution de l'instruction try et qu'il n'y a pas de clause except correspondante, l'exception sera soumise au try supérieur ou au niveau supérieur du programme. Le programme se terminera ici et le message d'erreur sera. imprimé.
Scénario 3 : Si aucune exception ne se produit lors de l'exécution de la clause try, Python continuera à exécuter l'instruction de code.
Après avoir compris le principe de la capture d'exception, voyons comment résoudre l'erreur TypeError précédente. Le sens littéral est que le type est erroné. Les entiers ne peuvent pas être comparés aux chaînes, mais en fait, nous l'avons déjà fait. la variable age avant le traitement, mais comme l'exception try est interceptée, la première clause except correspondant à try est exécutée et la clause remplace l'instruction d'exception, donc la conversion de type ici n'est pas valide et une erreur de type se produira lorsque le programme est exécuté. exécutez à nouveau. , la solution à ce problème est également très simple, il suffit de mettre la déclaration de jugement en essai.
Lorsque l'instruction de jugement est placée dans try, elle change légèrement. Si aucune exception n'est interceptée, le programme s'exécutera comme d'habitude et le jugement prendra effet, si une exception est interceptée, elle passera directement à la sortie d'exécution except, indiquant que votre âge est illégal. Il n'y aura plus de logique de jugement, donc les erreurs TypeError ne se produiront plus. Au fait, il s'agit de notre bug de développement commun "achetez-en un, obtenez-en un gratuitement". :
# 程序仍然有可优化的地方,仅展示try.. except语句的使用方式 print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) try: age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件") except: print("您的年龄输入非法,请重新运行本程序")
La capture d'exception spécifique, comme son nom l'indique, consiste à capturer une exception spécifique qui se produit, telle que la ValueError que nous avons rencontrée si vous capturez d'autres types d'exception. , puis lorsque le code est exécuté. Si vous rencontrez ValueError, vous obtiendrez toujours une erreur :
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) try: age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件") # 这里进行捕获的异常类型是IndexError,非ValueError,最后的结果仍然会报错,因为没有成功捕获 except IndexError: print("您的年龄输入非法,请重新运行本程序")
当捕获的类型错误时,仍然会弹出报错终止程序运行,好比一个人酒驾,那么就应该由交警处理而不是民政局的人处理,因为那不是它的职责,异常捕获还要讲究对口,如下代码所示,如果设置成ValueError就能够成功进行捕获,就好比交警处理了酒驾一样,完美解决:
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) try: age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件") except ValueError: print("您的年龄输入非法,请重新运行本程序")
刚刚我们举了一个例子,当异常捕获为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("万能捕手在此,束手就擒吧!")
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类派生的
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()
虽然我们能够捕获异常,但我们肯定要了解到底是什么异常,在捕获到一个异常时我们可以进行异常信息的打印:
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}")
刚刚有提到except与except Exception是等价的,但是如果想使用as必须要使用后者,这是语法规定:
# 正确用法,在捕获类型后加as 变量 except Exception as error: print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}") # 错误的用法,不符合语法规则 except as error: print("万能捕手在此,束手就擒吧!", f"已捕获异常:{error}")
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!