关于python的错误处理/调试与测试

一:错误处理
使用try catch时,如果没有错误发生,可以在except语句后面加一个else,当没有错误发生时,会自动执行else语句

try:
	print('try...')
	r = 10 / int('2')
	print('result:', r)
	except ValueError as e:
	print('ValueError:', e)
	except ZeroDivisionError as e:
	print('ZeroDivisionError:', e)
else:
	print('no error!')
finally:
	print('finally...')
	print('END')

二:调试
a:在初学python的时候我们很喜欢用print()把可能有问题的变量打印出来,但是这样有个最大的坏处就是未来我们还要删除掉它,如果忘记删除,运行结果也会包含很多垃圾信息,
b:所以就有了第二种方法:断言
凡是用print()来辅助查看的地方,都可以用断言(assert)来替代

 def foo(s):
      n=int(s)
      assert n!=0,'n is zero'
      return 10/n
 def main():
      foo('0'

在此处如果输入的值为0,则控制台会输出’n is zero’,如果不为0则可以当做pass略过
c:第三种方法是logging,与前两种相比,logging不会抛出错误,而且可以输出到文件

 import logging
        s='0'
        n=int(s)
        logging.info(n='%d'%n)
        print(10/n)

执行后会发现,输出的文本中没有n=%d的信息,这个时候需要在import下面加上logging.basicConfig(level=logging.INFO),
设置logging的级别,通过简单的配合,一条语句可以同时输出到不同的地方,可以是控制台可以是文件
d:启动python的调试器pdb,类似于直接在控制台去使用断点,单步调试等,效率较低
e:直接使用ide设置断点等

三:单元测试/文档测试
此处是官方文档链接,请自行选择相应版本
https://docs.python.org/zh-cn/3/library/unittest.html?highlight=assertequal
A:单元测试:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的检测工作
A-1:独立的测试是使用类方法,这些方法的命名都以test_开头,这个命名约定也是为了告诉测试者,类的哪些方法表示测试
调用assertEqual()来检查预期的输出;调用assertTrue()或assertFalse()来验证一个条件;调动assertRaise()来验证一个特定的异常,使用这些方法而不是assert语句,是为了让运行测试的人能够聚合所有的测试结果并生成结果报告。
针对asserRaise做一个补充,对于初学者来说,官网中的解释可能不够清楚,可以试试运行一下我补充的案例,针对这个案例可以更好的了解asserRaise的用法

def test_split(self):
    s = 'hello world'
    self.assertEqual(s.split(), ['hello', 'world'])
    # check that s.split fails when the separator is not a string
    with self.assertRaises(TypeError):
    s.split('raise zhe typrerror')#这样会显示TypeError not raised
    with self.assertRaises(TypeError):
    s.split(213)#如果触发了TypeError,则不会报错
    with self.assertRaises(ValueError):
    int('1sad')#如果触发了ValueError,则不会报错

B:文档测试:
此处是官方文档链接,请自行选择相应版本:https://docs.python.org/zh-cn/3/library/doctest.html?highlight=doctest
官方文档是这么说的:doctest 模块寻找像Python交互式代码的文本,然后执行这些代码来确保它们的确就像展示的那样正确运行,有许多方法来使用doctest
此处是引用了其他博主的链接:https://www.cnblogs.com/whrTC/p/9149997.html

 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)


if __name__ == '__main__':
    import doctest
    doctest.testmod()

#其中fact(-1)需要将报错的输出写出,只要是输出与期望值一致,就标记为测试成功。其中…代表中间一大段的输出。
注意到最后3行代码。当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。

1 '>>>‘开头的行就是doctest测试用例。
2 不带’>>>'的行就是测试用例的输出。
3 如果实际运行的结果与期望的不一致,就标记为测试失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值