错误处理

try

  • try...except...finally...的错误处理机制
  • 如果发生了不同类型的错误,应该由不同的except语句块处理,多个except来捕获不同类型的错误
  • Python的错误其实也是class,所有的错误类型都继承自BaseException,不但捕获该类型的错误,还把其子类的错误也一网打尽

    调用栈

  • 出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置

    记录错误

  • Python内置的logging模块logging.exception(e)可以非常容易地记录错误信息

    抛出错误

  • 根据需要,可以定义一个错误的class,选择好继承关系后用raise语句抛出一个错误的实例

  • raise语句如果不带参数,就会把当前错误原样抛出;在exceptraise一个Error可以把一种类型的错误转化成另一种类型

    错误处理

    print

  • print()最大的坏处是将来还得删掉它,运行结果会包含很多垃圾信息

    断言

  • 凡是用print()来辅助查看的地方,都可以用断言(assert)来替代

  • 启动Python解释器时可以用-O参数来关闭assert

    logging

  • logging允许指定记录信息的级别,有debuginfowarningerror等几个级别,一条语句可以同时输出到console和文件等不同的地方

    pdb

  • 启动Python的调试器pdb,让程序以单步方式运行可以随时查看运行状态

  • import pdb后,然后在可能出错的地方放一个pdb.set_trace()就可以设置一个断点,可以用命令p查看变量,或用命令c继续运行

    单元测试

  • 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作

  • 编写单元测试需要引入Python自带的unittest模块 ```python import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

  1. def test_init(self):
  2. d = Dict(a=1, b='test')
  3. self.assertEqual(d.a, 1)
  4. self.assertEqual(d.b, 'test')
  5. self.assertTrue(isinstance(d, dict))

```

  • 编写一个测试类需要从unittest.TestCase继承,以test开头的就是测试方法

    文档测试

  • 文档测试(doctest)模块可以直接提取注释中的代码并执行测试

  • doctest不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具可以自动把包含doctest的注释提取出来