Jay jay
文章28
标签2
分类0
python学习之异常处理和单元测试

python学习之异常处理和单元测试

异常类和异常处理

异常和异常类:

程序编译通过后,并不意味着运行就能获得正确结果,可能由于编程时考虑不周或运行时出现一些特殊情况(除数为零,越界,文件不存在等),结果出现中断程序正常运行,导致程序中断运行的错误称为异常(exception)又称例外。

异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行,在python无法处理程序时就会产生异常,发生异常要捕获否则终止执行程序。

常用异常类:

异常处理:

异常处理的格式:

try:
语句块 #包含可能发生的异常
except 异常类型 1 [ as 错误描述]:
语句块 #异常处理语句块
...
except 异常类型 2 [ as 错误描述]:
语句块 #异常处理语句块
except:
语句块 #默认异常处理语句块
[else:
语句块] #没有异常时执行的语句
[finally:
语句块] #任何情况下都执行的语句块

try子句:包含可能抛出异常的语句块

except子句:负责处理抛出的异常,处理的尝试顺序与多个except子句的编写顺序一致。当尝试发现第一个异常类型匹配的except子句时就执行其后的语句块。最后一个不指定异常类型的except子句匹配任何类型的异常。

else子句:当try子句中的语句块没有发生异常时执行,可选。

finally子句:无论是否抛出异常只要finally子句存在就会被最终执行。

try-except-else-finally语句的执行情况分为以下两种:

  1. try子句中的语句块没有发生异常,在执行完try子句中的语句块后,直接执行else子句块中语句块,最后执行finally子句中的语句块
  2. try子句中的语句块发生异常,发生异常的类型将和except子句的异常类型进行匹配并执行其后的语句块,最后执行finally子句中的语句块。

except子句else子句finally子句语句块可以为用户输出异常消息或提示信息,异常信息可以通过异常对象的message成员给出,也可以根据用户需求给出。

列表索引异常:

#try-except语句处理列表索引范围异常:
list1=[1,2,3,4,5,6,7]
try:
print(list1[10])
except IndexError as e:
print("列表索引超出范围")

处理不确定异常:

#try-except处理不确定异常:
a=100
try:
b=a+"python"
except Exception as e:
print("异常类型:%s"%type(e))
print("异常信息:%s"%e)

整除处理:

#整除处理:
x,y=eval(input("请输入两个整数:"))
try:
z=x/y
print("z=",z)
except TypeError as e1:
print("数据类型异常:",e1)
except ZeroDivisionError:
print("除数为零异常!")
except:
print("程序运行异常")
else:
print("程序正常执行!")

处理文件访问异常:

#处理文件访问异常:
try:
f=open("./1.txt","r")#报错的化指定编码格式encoding='utf=8'
str=f.read()
except Exception as e:
print("出现异常:%s"%e)
else:
print("执行成功!")
finally:
print("执行完毕!")

未指定编码格式

指定了编码格式

异常抛出:

在except子句、else子句、finally子句的语句块中还可以将异常抛出,提供给调用它的上一级处理。抛出异常有raise语句执行。

格式:raise[Exception [,args [,traceback]]] Exception为异常类型,args为用户提供的参数,可选。traceback跟踪异常对象,可选。

#抛出异常:
def greaterZero(n):
if n<0:
raise Exception("你传入了一个小于0的整数") #抛出异常
else:
print("n=",n)
try:
x=int(input("请输入一个整数"))
greaterZero(x)#调用函数
except Exception as e:
print(e)

断言语句:

assert断言语句是一种在程序测试中比较常用的技术,常用于在程序的某个位置判断是否满足某个条件。assert语句格式:

assert  expression[,atguments]

其中express是结果为布尔值的表达式。arguments为参数,一般为错误提示信息,可选。assert断言语句的执行过程:如果expression的值为真,则程序忽略expression后面的参数,执行assert语句后面的语句;否则,assert语句触发异常。

上述表达式为真不抛出异常,表达式为假抛出异常

在程序测试中未发现错误后,将python源程序编译为字节码文件时可以用优化参数-o或-oo将assert语言从程序语句中删除

单元测试:

软件测试一般分为白盒测试和黑盒测试,对于业务比较复杂代码量大的软件白盒测试的难度较高,通常以黑盒测试为主,黑盒测试也称功能测试,通过测试来检测每一个功能能否正常使用。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要对软件界面和软件功能进行测试。单元测试是保证软件开发质量的基本方法,用于检验被测代码的一个很小的很明确的功能是否正确。一个单元测试判断某个特定函数的行为在各个情形下都符合要求,单元测试是最低级的测试活动。

python中用于进行单元测试的常用库是Unittest,其中最常用的是testcase类,其常用函数如下:

#Unittest模块测试函数功能的正确性
import unittest
#定义测试类:
class TestCaseOfArea(unittest.TestCase):
#定义测试方法,必须以test开头
def test_are(self):
area=getArea(3,4)
#断言方法用来核实得到的结果是否与期望的结果一致
self.assertEqual(area,12,msg="测试未通过!")
#定义求矩形面积函数:
def getArea(x,y):
return x*y
#执行测试
if __name__ == '__main__':
unittest.main()

当计算结果和预测结果不同时

本文作者:Jay jay
本文链接:https://yyj-xx.github.io/2021/10/24/python%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E5%92%8C%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可