Python中可以使用断言assert
,logging
等来进行调试
断言
def fun(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
fun('0')
若assert
后面的语句不为True
,则assert
会抛出异常AssertionError
,并显示后一句'n is zero'
:
Traceback (most recent call last):
File "hello.py", line 12, in <module>
main()
File "hello.py", line 9, in main
fun('0')
File "hello.py", line 4, in fun
assert n != 0, 'n is zero!'
AssertionError: n is zero!
在我们不需要使用assert
时可以在启动Python解释器时,添加-O(大写字母O)
参数来关闭断言:
..path:> python -O hello.py
Traceback (most recent call last):
File "hello.py", line 12, in <module>
main()
File "hello.py", line 9, in main
fun('0')
File "hello.py", line 5, in fun
return 10 / n
ZeroDivisionError: division by zero
关闭后,解释器将忽略assert
,可以把它看作pass
logging
和assert
相比,logging
不会抛出错误,允许指定要输出错误的级别(debug
,info
,warning
,error
等)
import logging
# 指定输出错误级别为INFO
logging.basicConfig(level=logging.INFO)
s = '0'
n = int(s)
logging.info('n=%d' % n)
print(10/n)
运行结果:
INFO:root:n=0
Traceback (most recent call last):
File "hello.py", line 9, in <module>
print(10/n)
ZeroDivisionError: division by zero
在指定输出等级后,其余等级就不起作用,方便控制
此外,logging
可以将语句输出到不同地方,如console和文件
pdb
pdb(The Python Debugger)是Python内置的调试器,可以让程序单步运行
控制台中使用
在启动Python解释器时附带参数-m pdb
,程序会开始单步运行,等待下一指令:
..path:> python -m pdb hello.py
> c:\users\1\documents\c\python\hello.py(2)<module>()
-> import logging #定位下一步要执行的代码
(Pdb) #等待指令
常用指令:
|h(elp) [command]
无参数时打印所有操作,有则打印相应操作帮助
|l(ist)
查看所有代码
|n(ext)
单步执行代码
|p 变量名
查看变量
|c(ont(inue))
继续执行,直到遇到断点
|q(uit)
结束调试
更多见官方文档
pdb.set_trace()
首先import pdb
,在代码可能出错的地方放置pdb.set_trace()
即可设置断点
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print(10 / n)