当前位置: 首页 > 后端技术 > Python

Python学习系列——错误、调试与测试学习(七)

时间:2023-03-25 22:32:01 Python

错误处理程序运行时可能会出现很多问题,也会出现很多错误。所以,我们应该事先约定好发生错误时应该返回的错误码,这样我们在程序出错的时候可以快速的找到错误位置,然后进行更正。在return方法中用错误码来表示是否有错误是很不方便的,因为函数本身应该返回的正常结果和错误码混在一起了。一旦出现错误,需要逐层上报,直到某个函数能够处理错误。defdo_some(x):返回x/2deffoo():r=do_some(-2)如果r==-1:返回-1返回rdefbar():r=foo()如果r==-1:print("Error")else:print("OK")bar()运行结果:Errortry...except...finally...方法我们先把可能报错的代码放到try中运行;if执行出错,则跳转到错误处理代码,即except中的错误处理;执行完except后,如果有finally就执行,没有就跳出这个方法,执行剩下的方法。deffoo():try:print("try...")r=100/0print("return:",r)除了Exceptionase:print("except",e)finally:print("finally...")print("end...")foo()运行结果:try...exceptdivisionbyzerofinally...end...根据上述方法的运行结果,我们可以看到代码不会因为错误而失败运行print("return:",r),而是直接运行错误码的处理逻辑。如果我们修改这里的代码:deffoo():try:print("try...")r=100/5print("return:",r)exceptExceptionase:print("except",e)finally:print("finally...")print("end...")foo()results:try...return:20.0finally...end...这里我们会看到错误处理逻辑是没有执行是因为try里面的代码运行的时候没有报错。记录错误我们应该及时记录错误,以便日后查询和修改。同时,我们还需要程序继续向下执行。importloggingdeffoo(x):returnx/0defmain():try:foo(100)*2exceptExceptionase:logging.exception(e)main()print("END")运行结果:错误:根:除以zeroTraceback(最近调用最后):文件“D:/WorkSpace/python/test.py”,第65行,在mainfoo(100)*2文件“D:/WorkSpace/python/test.py”中,line60,infooreturnx/0ZeroDivisionError:divisionbyzeroEND可以看到程序遇到错误打印错误信息,直接继续执行。抛出错误我们在编写程序时可能会遇到错误。有时我们不会在当前代码处处理它们,我们可能想把它们扔到合适的位置处理。这个时候我们需要把错误向上抛。这里我们需要用到一个关键字:raise,这个关键字可以抛出我们的错误。deffoo(s):n=int(s)ifn==0:raiseValueError('invalidvalue:%s'%s)return10/ndefbar():try:foo('0')exceptValueErrorase:print('ValueError!')raisebar()操作结果:Traceback(最近调用last):文件“D:/WorkSpace/python/test.py”,第88行,在bar()文件“D:/WorkSpace/python/test.py”,第82行,在barfoo('0')文件“D:/WorkSpace/python/test.py”,第76行,在fooraiseValueError('invalidvalue:%s'%s)ValueError:无效值:0ValueError!这里我们会发现错误是在foo()方法中被捕获然后向上抛给bar()方法处理的。