断言assert
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
foo('0')
assert
的意思是,表达式n != 0
应该是True
,否则,根据程序运行的逻辑,后面的代码肯定会出错。
如果断言失败,assert
语句本身就会抛出AssertionError
:
Traceback (most recent call last):
...
AssertionError: n is zero!
启动Python解释器时可以用-O参数来关闭assert
logging
和assert
比,logging
不会抛出错误,而且可以输出到文件:
import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
logging.info()
就可以输出一段文本。运行,发现除了ZeroDivisionError
,没有任何信息。
在import logging
之后添加一行配置
import logging
logging.basicConfig(level=logging.INFO)
输出:
INFO:root:n = 0
Traceback (most recent call last):
File "err.py", line 8, in <module>
print(10 / n)
ZeroDivisionError: division by zero
这就是logging
的好处,它允许你指定记录信息的级别,有debug,info,warning,error
等几个级别,当我们指定level=INFO
时,logging.debug
就不起作用了。同理,指定level=WARNING
后,debug
和info
就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
logging
的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console
和文件。(console控制台)
日志记录级别怎么选
logging输出的信息完全是开发者指定,级别也是已经指定好,也就是说是在可能的错误地方事先准备
pdb
pdb让程序以单步方式运行,可以随时查看运行状态。
以参数-m pdb
启动
输入命令n
可以单步执行代码(next)
任何时候都可以输入命令p 变量名
来查看变量
pdb详解
输入命令q
结束调试,退出程序
pdb.set_trace()
只需要在文件中import pdb
,然后,在可能出错的地方放一个pdb.set_trace()
,就可以设置一个断点:
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print(10 / n)
程序会自动在pdb.set_trace()
暂停并进入pdb调试环境,可以用命令p
查看变量,或者用命令c
继续运行