Python における例外の導入、捕捉、処理に関する知識を中心に解説します
#例外処理を正式に導入する前に、まず概念を理解する必要があります。プログラミングを完璧にすることは不可能であり、考慮できない状況が常に存在します。 , なぜなら、完璧な人はいないからです。人間、人間には欠陥があります。プログラミングが人間によって行われることは言うまでもありません。実際のプロジェクトでは、誰かが言うことを信じないでください。「私のコードは完璧であり、これには間違いなく問題はありません。」言い換えれば、プログラミングの意味を知らなければいけないということですが、この世界には絶対的な信頼性はありません。
また、プログラムが人間によって作成される限り、必ず問題が発生することを皆さんも認識しておく必要があります。プログラムが通常のプロセスに従って実行されない場合、それを例外と呼びます。その名のとおり、この異常な状況を解決し、プログラムをロジックとフローに従って正常に実行できるようにするものです。
プログラムが実行されてエラーが報告されると、その操作は終了します。例外を処理した後で例外を再度実行すると、エラーは発生しなくなります。このエラーをキャプチャすることで、プログラムをスムーズに実行できるようになります。この例外処理のプロセスは、例外キャッチと呼ばれます。まず例を見てみましょう:
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件")
上記のコードでは、入力データが18の場合は正常に実行できます プログラムの論理計算により最後まで正常に実行されますが、このようなコードは本当に問題ないのでしょうか?この例をもう一度見てみましょう。入力が abc 英字の場合、ValueError エラーが発生します。文字通りの意味は、数値エラーが発生し、文字列を整数に変換できないことを示します:
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件")
上の図に示すように、ValueError エラーが発生した場合は、例外キャプチャを通じて処理できます。処理されたコードは次のとおりです:
print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) try: age = int(age) except: print("您的年龄输入非法,请重新运行本程序") if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件")
# 程序仍然有可优化的地方,仅展示try.. except语句的使用方式 print("------------------- 欢迎来到报名注册系统 -------------------") age = (input("请输入您的年龄:")) try: age = int(age) if age < 18: print("很遗憾,您暂时不满足注册条件") else: print("恭喜您符合注册条件") except: print("您的年龄输入非法,请重新运行本程序")
##2.4 特定の例外のキャプチャ
当捕获的类型错误时,仍然会弹出报错终止程序运行,好比一个人酒驾,那么就应该由交警处理而不是民政局的人处理,因为那不是它的职责,异常捕获还要讲究对口,如下代码所示,如果设置成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}")
以上がPython 自動テストで例外処理メカニズムを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。