# 代码调试
## 一、print()
简单粗暴。
## 二、assert
凡是用`print()`来辅助查看的地方,都可以用断言(assert)来替代。如果断言失败,`assert`语句本身就会抛出`AssertionError`。
启动Python解释器时可以用`-O`参数来关闭`assert`,所有的`assert`语句都会被`pass`。断言的开关“-O”是英文大写字母O,不是数字0。
## 三、logging
把`print()`替换为`logging`是第3种方式,和`assert`比,`logging`不会抛出错误,而且可以输出到文件。
```python
import logging
logging.basicConfig(level=logging.INFO)
s = '0'
n = int(S)
logging.info('n = %d'%n)
print(10 / n)
```
此方法允许你指定记录信息的级别,有`debug`,`info`,`warning`,`error`等几个级别,当我们指定`level=INFO`时,`logging.debug`就不起作用了。同理,指定`level=WARNING`后,`debug`和`info`就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。`logging`的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。
## 四、pdb
第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。
```bash
python -m pdb err.py
# 以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = '0'。输入命令l来查看代码
# 输入命令n可以单步执行代码
# 任何时候都可以输入命令p 变量名来查看变量
# 输入命令q结束调试,退出程序
```
## 五、pdb.set_trace()
这个方法也是用pdb,但是不需要单步执行,我们只需要`import pdb`,然后,在可能出错的地方放一个`pdb.set_trace()`,就可以设置一个断点。
```python
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 运行到此处暂停
print(10 / n)
```
运行代码,程序会自动在`pdb.set_trace()`暂停并进入pdb调试环境,可以用命令`p`查看变量,或者用命令`c`继续运行。
## 六、IDE
Pycharm、VS code。