zoukankan      html  css  js  c++  java
  • Python学习笔记(五)

    1. 错误,调试和测试

    1.1 错误处理

    try…except…finally…

    1. 如果有finally语句,不管是否捕获异常,finally语句一定会被执行。
    2. 在except后加else,当没有错误发生时,会自动执行else语句。
    3. Python的错误也是class,在使用except的时候注意,它不但捕获该类型的错误,还捕获其子类的错误。

    调用堆栈
    如果错误一直没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误消息,然后程序退出。

    1. # err.py:
    2. def foo(s):
    3. return 10 / int(s)
    4. def bar(s):
    5. return foo(s) * 2
    6. def main():
    7. bar('0')
    8. main()

    记录错误
    既然我们能捕获异常,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。
    Python内置的logging模块可以非常容易地记录错误信息。

    1. # err_logging.py
    2. import logging
    3. def foo(s):
    4. return 10 / int(s)
    5. def bar(s):
    6. return foo(s) * 2
    7. def main():
    8. try:
    9. bar('0')
    10. except Exception as e:
    11. logging.exception(e)
    12. main()
    13. print('END')

    通过配置,logging还可以把错误记录到日志文件里。
    抛出错误
    因为错误是class,捕获一个错误就是捕获该class的一个实例。因此,错误不是凭空产生的,而是有意创建并抛出的。

    1. # err_raise.py
    2. class FooError(ValueError):
    3. pass
    4. def foo(s):
    5. n = int(s)
    6. if n==0:
    7. raise FooError('invalid value: %s' % s) # 如果要抛出错误,首先,根据需要,可以定义一个错误的class,选择好继承关系,然后用raise语句抛出一个错误的实例。
    8. return 10 / n
    9. foo('0')

    1.2 调试

    使用print()打印可能有问题的变量。
    断言

    1. def foo(s):
    2. n = int(s)
    3. assert n != 0, 'n is zero!'
    4. return 10 / n
    5. # assert的意思是表达式n!=0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会出错
    6. def main():
    7. foo('0')
    8. ---
    9. $ python3 err.py
    10. Traceback (most recent call last):
    11. ...
    12. AssertionError: n is zero!

    Logging:和assert相比,logging不会抛出错误,而且可以输出到文件。

    1. import logging
    2. logging.basicConfig(level=logging.INFO) # 指定记录信息的级别
    3. s = '0'
    4. n = int(s)
    5. logging.info('n = %d' % n) # logging.info()可以输出一段文本
    6. print(10 / n)

    pdb:启动Python解释器的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。
    pdb.set_trace:只需要import pdb,然后在可能出错的地方设置pdb.set_trace(),就可以设置一个断点。

    1. # err.py
    2. import pdb
    3. s = '0'
    4. n = int(s)
    5. pdb.set_trace() # 运行到这里会自动暂停,用命令p查看变量,命令c继续执行
    6. print(10 / n)

    IDE:PyCharm…

    1.3 单元测试

    单元测试是用来对一个模块,一个函数或者一个类来进行正确性检验的测试工作。
    为了编写单元测试,需要引入Python自带的unittest模块。编写单元测试时,需要编写一个测试类,从unittest.TestCse继承。
    以test开头的方法是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。

    1. self.assertEqual(abs(-1), 1) # 断言函数返回的结果与1相等
    2. with self.assertRaises(KeyError):
    3. value = d['empty']

    setUp()和setDown()
    可以在单元测试中编写两个特殊的setUp()和setDown()方法,这两个方法分别在每调用一个测试方法的前后分别被执行。

    1.4 文档测试

    示例代码:很多文档都有示例代码,这些示例代码在Python的交互环境下输入并执行,结果与文档中的示例代码显示的一致。这些代码与其他说明可以写在注释中,然后,由一些工具来自动生成文档。
    Python内置的文档测试(doctest)模块可以直接提取注释中的代码并执行测试。


    感谢廖雪峰的官方网站提供的教程。Python学习笔记系列都基于廖老师的教程。





  • 相关阅读:
    单循环判断数组中是否有存在重复值
    【Moss2010系列】利用BCS进行业务数据集成(1)
    状态压缩
    矩阵快速幂
    高精度加法
    旋转treap
    bitset
    快速幂
    splay
    考试注意
  • 原文地址:https://www.cnblogs.com/aniudcs/p/faf7b80bc014bd23946eeda6bdbf99d0.html
Copyright © 2011-2022 走看看