写python的人一般都不太看重调试, 因为这是一门解释性语言, 在哪出错会立马在解释器里提示出来。但是, 以上观点只适用于小的脚本或者项目。因为我在接触目前项目之前, 我一直都是这么做的。
对于一个大的项目来说, 调试就不能这么做了, 这种大项目通常都是多进程或者多线程, 普通的调试基本没办法。通常会通过记录日志来调试, 记录日志。。这里就是我想说得一个坑。正常的项目里面都会有容错处理, 也就是各种try...except, 然后把抛出的异常写到日志, 出错的时候就可以通过看错误日志去定位信息。 但是, 抛出的异常通常只是一句话, 无法得到具体的错误代码行, 这在一个模块比较多的项目里简直就是噩梦, 你可能要花费很多时间去定位错误所在地方, 效率极其低下。 肿么办呢, python里面有一个模块叫traceback, 这个模块是干嘛的呢, 请看官方解释:
This module provides a standard interface to extract, format and print stack traces of Python programs. It exactly mimics the behavior of the Python interpreter when it prints a stack trace. This is useful when you want to print stack traces under program control, such as in a “wrapper” around the interpreter.
也就是说, 这个模块就像一个缩小版的解释器一样, 可以跟踪代码运行栈。 简单来说, 可以看到代码详细出错信息, 包括在哪出错。怎么用呢, 就说一种用法, 我觉得够用了:
import traceback
try:1/0
except Exception as e:traceback.print_exc(file=open('/tmp/error', 'wb'))
这样程序在抛出异常后, 就会将出错信息写到'/tmp/error'这个文件中, just enjoy it!
另外要说的一种方法是logging模块中用到的方法。
对于大型项目而言,用logging模块调试是一种更好的方法,日志集中管理。
要使用日志,首先要声明一个logger,具体怎么声明这里不再赘述,参见python官方文档或者google。
效果和traceback一样,代码如下:
try:1/0
except Exception as e:logger.exception(e)