首页 > 技术文章 > 代码查错方法总结

zzy-9318 2018-11-26 20:24 原文

1、使用正常的 print()进行输出:

# printTest.py


def foo(s):
    n = int(s)
    print('>>> n = %d' % n)
    return 10 / n

def main():
    foo('0')

main()
复制代码
(venv) E:\pyplace\learn_python3\learn\two\调试>python printTest.py
>>> n = 0
Traceback (most recent call last):
  File "printTest.py", line 9, in <module>
   ...
ZeroDivisionError: division by zero

用 print() 不好的地方就是,程序中到处都是 print(),运行结果也包含很多垃圾信息

 

2、使用断言:

# assert.py


def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n

def main():
    foo('0')

main()
复制代码
E:\py\venv\Scripts\python.exe E:/pyplace/learn_python3/learn/two/调试/assert.py
Traceback (most recent call last):
 ...
    assert n != 0, 'n is zero!'
AssertionError: n is zero!

asset 的意思是,表达式 n != 0 应该是 true 。否则后面的代码会出错 如果断言失败,assert 就会抛出 AssertionErrot

注意:

  1. assert 和 print()相比较好不到哪里去,一样在代码中会出现太多,并且输出结果垃圾信息多

  2. 不过 assert 可以使用 -O 参数来关闭 assert(大写的O,不是零)

3、使用logging(把 print() 替换为 logging 是第3种方式):

和 assert比较,不仅可以抛出错误,还可以输出到文件

#loggingTest.py

import logging

logging.basicConfig(level= logging.INFO)  #  注意一定要写这个,不然就不会输出信息
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
复制代码
E:\py\venv\Scripts\python.exe E:/pyplace/learn_python3/learn/two/调试/loggingTest.py
INFO:root:n = 0
Traceback (most recent call last):
  File "E:/pyplace/learn_python3/learn/two/调试/loggingTest.py", line 7, in <module>
    print(10 / n)
ZeroDivisionError: division by zero

logging.basicConfig(level= logging.INFO) # 注意一定要写这个,不然就不会输出 INFO 信息

 

提示

  1. logging 的好处,可以指定信息的级别(debug, info, warning, error 等)

  2. 当我们指定 level = INFO 时, logging.debug 就不起作用,也就是只能一个等级起作用。

  3. loggging 的另外一个好处,通过简单的配置,可以同时输出到 console 和 文件

 

推荐阅读