错误、调试和测试
1. 错误处理
错误信息如下:
100 + 200 + 345 = 645
Traceback (most recent call last):
File "main.py", line 18, in <module>
main()
File "main.py", line 15, in main
r = calc('99 + 88 + 7.6')
File "main.py", line 10, in calc
return reduce(lambda acc, x: acc + x, ns)
File "main.py", line 5, in str2num
return int(s)
ValueError: invalid literal for int() with base 10: ' 7.6'
处理方式1(查看代码):
- 梳理下调用过程:入口函数
main()
→calc()
→str2num()
main()
函数中计算两个r,使用calc()
函数计算,calc()
接收参数用+
进行split()
切割,之后调用str2num()
函数将参数转化成int
型返回,使用map()
高阶函数作用于每个参数,最后使用reduce()
结合lambda
匿名函数进行整型的相加,并返回,最后由main()
函数进行打印计算结果- 经分析可知,传入的字符串参数,原型应该为整型,否则在
str2num()
函数中会报错,没有错误处理则返回给Python解释器进行报错。第一个r
中三个参数都是整型没问题,会正常输出计算结果;第二个r
中包含'7.6'
,原型不是整型的参数,则会报错 - 查看报错信息最后一行“ValueError: invalid literal for int() with base 10: ’ 7.6’”也是在这个原因,是
ValueError
错误,修改的话只需将'7.6'
改为整型的字符串即可
处理方法2(由错误信息进行错误定位):
- 前边的错误逻辑就不多赘述了,实际开发中也会直接定位到最后的错误信息,是
File “err_pir.py”, line 5, in str2num
return int(s)
ValueError: invalid literal for int() with base 10: ’ 7.6’ - 很明显,
str2num
返回int(s),但有个参数是'7.6'
无法使用int()
函数进行转化而报错,找到出现'7.6'
的信息是
File “F:err_pir.py”, line 17, in main
r = calc(‘99 + 88 + 7.6’)
即第17行,这样就知道错误和出错位置了,修改下即可。
推荐的话肯定是方法2的,因为如果代码量多的话,方法1不现实。
2. 单元测试
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if 80 > self.score >= 60:
return 'B'
if 100 >= self.score >= 80:
return 'A'
if 0 <= self.score < 60:
return 'C'
else:
raise ValueError(ValueError)
根据测试用例,确定score
的区间范围,不在0~100之间的需要返回ValueError
错误。
3. 文档测试
def fact(n):
'''
Calculate 1*2*...*n
>>> fact(1)
1
>>> fact(10)
3628800
>>> fact(-1)
Traceback (most recent call last):
...
ValueError
'''
if n < 1:
raise ValueError()
if n == 1:
return 1
return n * fact(n - 1)
直接运行代码发现10
的结果是 3628800,将其写到fact(10)
下;
-1
应该报ValueError
,因此在fact(-1)
下按格式写入:
Traceback (most recent call last):
...
ValueError
即可。