Debug
debug的工具主要有print, log, assert, traceback, Raise Error等等,以及程序正确运行但没有正确输出时的debug 往往通过print和log来分析问题。assert 在写代码时用的比较多,一些确保正确才能进行运算的情况下可以快速定位。
Assert
断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现。
assert expression1 ["," expression2]
计算expression1 返回true or False,为False时输出aeertionerror:expression2
1)断言应该使用在正常逻辑不可到达的地方或正常情况下总是为真的场合。
2)如果Python本身的异常能够处理就不要再使用断言。如对于类似于数组越界、类型不匹配、除数为0之类的错误,不建议使用断言来进行处理。
3)不要使用断言来检查用户的输入。较好的做法是使用条件判断,并在不符合条件的时候输出错误提示信息。
4)在函数调用后,当需要确认返回值是否合理时可以使用断言。
5)当条件是业务逻辑继续下去的先决条件时可以使用断言。如list1和其副本list2,业务继续下去的条件是这两个list必须是一样的,但由于某些不可控因素,如使用了浅拷贝而list1中含有可变对象等,就可以使用断言来判断这两者的关系,如果不相等,则继续运行后面的程序意义不大。
Raise NotImplementedError
Python编程中raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制。在面向对象编程中,可以先预留一个方法接口不实现,在其子类中实现。
如果要求其子类一定要实现,不实现的时候会导致问题,那么采用raise的方式就很好。
而此时产生的问题分类是NotImplementedError。
traceback
以获取栈信息。
if __name__ == '__main__':
try:
f()
except IndexError as ex:
print "Sorry,Exception occured,you accessed an element out of range"
print ex
print traceback.print_exc()
traceback.print_exc()方法打印出的信息包括3部分:错误类型(IndexError)、错误对应的值(list index out of range)以及具体的trace信息,包括文件名、具体的行号、函数名以及对应的源代码。
logging
import logging
logging.basicConfig( # 配置日志的输出方式及格式
level=logging.DEBUG,
filename='log.txt',
filemode='w',
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
)
logging.info('[INFO]:calling method i() in h()')
logging.error('[Error]:Soory,Exception occured')
logging.debug()
logging.setLevel()
logging.addFilter()
Level | Describtion |
---|---|
DEBUG | details |
INFO | information |
WARNING | unforecasted problem but not important |
ERROR | some functions of program don’t work |
CRITICAL | program don’t work |
【官方文档】