网站建设实验的建议和看法,设计师 英文网站,哪个网站做效果图好,建网站权威公司文章目录1. 错误处理2. debugassertloggingpdbIDE3. unittest编写运行setUp 与 tearDown4. doctest1. 错误处理
try:# 可能有异常的代码块r 10/int(2)
except ValueError as e:# 有异常时执行#xff0c;捕获指定类型及其子类型的错误print(ValueError, e)
except ZeroDivis…
文章目录1. 错误处理2. debugassertloggingpdbIDE3. unittest编写运行setUp 与 tearDown4. doctest1. 错误处理
try:# 可能有异常的代码块r 10/int(2)
except ValueError as e:# 有异常时执行捕获指定类型及其子类型的错误print(ValueError, e)
except ZeroDivisionError as e:# 当前面的异常命中后后面不会再次捕获print(ZeroDivisionError, e)
else:# 无异常时执行print(no error.)
finally# 上面结束后一定会执行print(finally)调用栈
从上到下时整个错误的调用函数链依次从外到内
记录错误
try:r 10/int(0)
except Exception as e:# 记录错误堆栈logging.exception(e)抛出异常
# 自定义异常
class FooError(ValueError):pass# 抛出异常
raise FooError(invalid value)# 捕获异常原样抛出
except ValueError as e:raise# 转化成另一种异常抛出
except ZeroDivisionError:raise ValueError(input error.)程序主动抛出异常时应该在文档写清楚可能抛出的异常及其原因方便调用者处理相应的错误
2. debug
assert
如果断言的语句不成立assert 语句会抛出 AssertionError
assert n!0, n is zero.可以通过 -O 参数关闭断言关闭后assert 语句相当于 pass
logging
import logging
logging.basicConfig(levellogging.INFO)logging.info(xxx)logging level
CRITICALERRORWARNING - 根记录器级别默认级别INFODEBUGNOTSET - 默认级别处理所有消息
logging 的另一个好处时通过配置一条消息可以同时输出到不同的地方比如console、文件、database
多使用logging
pdb
以参数-m pdb启动.py单步运行
python -m pdb xxx.pypdb界面指令
指令作用l查看代码n单步执行pp 变量名 查看变量q结束调试退出程序c继续运行
set_trace()
设置断点进入调试后通过c命令运行自动暂停在该断点处
IDE
Visual Studio Code
PyCharm
3. unittest
TDD
测试驱动开发Test Driven Development
单元测试是未来重构代码的保障
单元测试要覆盖常用输入组合边界条件异常
单元测试不能太复杂否则自身也可能有 bug
编写
import unittest
class TestDict(unittest.TestCase):def test_init(self):d dict(a1, btest)# 断言相等self.assertEqual(d.a, 1)self.assertEqual(d.b, test)# 断言为真self.assertTrue(isinstance(d, dict))def test_keyerror(self):d dict()# 期待语句块中抛出指定类型的 Errorwith self.assertRaises(KeyError):value d[empty]单元测试类继承自unittest.TestCase
单元测试方法必须以test开头命名否则不会被执行
运行
通过代码运行
if __name__ __main__:unittest.main()通过命令参数运行
python -m unittest mytestsetUp 与 tearDown
在每调用一个单元测试的前后被执行
4. doctest
文档测试既可以用来运行测试也是实例代码
严格按照 Python 交互命令行的输入和输出来判断测试结果的正确性
在测试异常时可用...表示中间省略的输出
class Dict(dict):Simple dict but also support access as x.y style. d1 Dict() d1[x] 100 d1.x100 d1.y 200 d1[y]200 d2 Dict(a1, b2, c3) d2.c3 d2[empty]Traceback (most recent call last):...KeyError: empty d2.emptyTraceback (most recent call last):...AttributeError: Dict object has no attribute emptydef __init__(self, **kw):super(Dict, self).__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(fDict object has no attribute {key})def __setattr__(self, key, value):self[key] valueif __name__ __main__:import doctestdoctest.testmod()运行
python mydict.py没有输出既是运行正确 上一篇「Python 基础」面向对象编程 专栏《Python 基础》
PS感谢每一位志同道合者的阅读欢迎关注、评论、赞