14.12 调试基本的程序崩溃错误

    如果你的程序因为某个异常而崩溃,运行 可执行简单的调试。-i 选项可让程序结束后打开一个交互式shell。然后你就能查看环境,例如,假设你有下面的代码:

    运行 python3 -i sample.py 会有类似如下的输出:

    1. bash % python3 -i sample.py
    2. Traceback (most recent call last):
    3. File "sample.py", line 6, in <module>
    4. func('Hello')
    5. File "sample.py", line 4, in func
    6. TypeError: Can't convert 'int' object to str implicitly
    7. >>> func(10)
    8. 20
    9. >>>

    如果你看不到上面这样的,可以在程序崩溃后打开Python的调试器。例如:

    如果你的代码所在的环境很难获取交互shell(比如在某个服务器上面),通常可以捕获异常后自己打印跟踪信息。例如:

    1. import traceback
    2. import sys
    3.  
    4. try:
    5. except:
    6. print('**** AN ERROR OCCURRED ****')
    7. traceback.print_exc(file=sys.stderr)

    另外,你还可以像下面这样使用 pdb.set_trace() 在任何地方手动的启动调试器:

    1. import pdb
    2.  
    3. def func(arg):
    4. ...
    5. pdb.set_trace()

    当程序比较大而你想调试控制流程以及函数参数的时候这个就比较有用了。例如,一旦调试器开始运行,你就能够使用 来观测变量值或敲击某个命令比如 w 来获取追踪信息。

    不要将调试弄的过于复杂化。一些简单的错误只需要观察程序堆栈信息就能知道了,实际的错误一般是堆栈的最后一行。你在开发的时候,也可以在你需要调试的地方插入一下 print()函数来诊断信息(只需要最后发布的时候删除这些打印语句即可)。

    调试器的一个常见用法是观测某个已经崩溃的函数中的变量。知道怎样在函数崩溃后进入调试器是一个很有用的技能。

    实际上,程序会一直运行到碰到 set_trace() 语句位置,然后立马进入调试器。然后你就可以做更多的事了。

    如果你使用IDE来做Python开发,通常IDE都会提供自己的调试器来替代pdb。更多这方面的信息可以参考你使用的IDE手册。

    原文: