调试

第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:

>>> def foo(s):

n= int(s)

print '>>> n = %d' % n

return 10 / n

>>> def main():

foo('0')

>>> main()

>>> n = 0

Traceback (most recent call last):

File "<pyshell#25>", line 1, in <module>

main()

File "<pyshell#24>", line 2, in main

foo('0')

File "<pyshell#22>", line 4, in foo

return 10 / n

ZeroDivisionError: integer division ormodulo by zero

  

断言

凡是用print来辅助查看的地方,都可以用断言(assert)来替代:

>>> def foo(s):

n=int(s)

assertn!=0,'n is zero'

return10/n

>>> def main():

foo('0')

>>> main()

Traceback (most recent call last):

File "<pyshell#37>", line 1, in <module>

main()

File "<pyshell#36>", line 2, in main

foo('0')

File "<pyshell#32>", line 3, in foo

assert n!=0,'n is zero'

AssertionError: n is zero

  

logging

把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

>>> import logging

>>>logging.basicConfig(level=logging.INFO)

>>> s='0'

>>> n=int(s)

>>> logging.info('n=%d' % n)

>>> print 10/n

Traceback (most recent call last):

File "<pyshell#48>", line 1, in <module>

print 10/n

ZeroDivisionError: integer division ormodulo by zero

  

pdb

第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。

# err.py

s = '0'

n = int(s)

print 10 / n

$ python -m pdb err.py

> /Users/michael/Github/sicp/err.py(2)<module>()

-> s = '0'

  

以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = '0'。输入命令l来查看代码:

(Pdb) l

1 # err.py

2 -> s = '0'

3 n = int(s)

4 print 10 / n

[EOF]

输入命令n可以单步执行代码:

(Pdb) n

>/Users/michael/Github/sicp/err.py(3)<module>()

-> n = int(s)

(Pdb) n

>/Users/michael/Github/sicp/err.py(4)<module>()

-> print 10 / n

任何时候都可以输入命令p 变量名来查看变量:

(Pdb) p s

'0'

(Pdb) p n

0

输入命令q结束调试,退出程序:

(Pdb) n

ZeroDivisionError: 'integer division ormodulo by zero'

>/Users/michael/Github/sicp/err.py(4)<module>()

-> print 10 / n

(Pdb) q

Try

这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦

pdb.set_trace()

这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:

# err.py
import pdb

s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print10 / n

运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:

$ python err.py

>/Users/michael/Github/sicp/err.py(7)<module>()

-> print 10 / n

(Pdb) p n

0

(Pdb) c

Traceback (most recent call last):

File "err.py", line 7, in <module>

print 10 / n

ZeroDivisionError: integer division ormodulo by zero

这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。

Python学习 Day 12 调试 断言 logging pdb pdb.set_trace的更多相关文章

  1. 转 Python3 错误和异常/ Python学习之错误调试和测试

    ########sample 0 https://www.cnblogs.com/Simon-xm/p/4073028.html except: #捕获所有异常 except: <异常名> ...

  2. python学习笔记9--日志模块logging

    我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志.介绍一下logging模块,logging模块就是python里面用来操作日志的模 ...

  3. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  4. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  5. Python学习(12)日期和时间

    目录 Python 日期和时间 时间元组 获取当前时间 获取格式化时间 格式化日历 获取某月日历 Time模块 日历模块 其他相关模块和函数 Python 日期和时间 Python 程序能用很多方式处 ...

  6. Python学习:12.Python字符串格式化

    字符串格式化 讲解Python这么久,也没有讲解Python的字符串的格式化,那我们今天就来了解一下python字符串格式化的强大之处. 首先我们先理解一下为什么要有字符串的格式化,就是为了方便字符串 ...

  7. python 学习笔记12(事件驱动、IO多路复用、异步IO)

    阻塞IO和非阻塞IO.同步IO和异步IO的区别 讨论背景:Linux环境下的network IO. 1.先决条件(几个重要概念) 1.1.用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32 ...

  8. python学习(12)使用正则表达式

    1.正则表达式知识 符号 解释 示例 说明 . 匹配任意字符 b.t 可以匹配bat / but / b#t / b1t等 \w 匹配字母/数字/下划线 b\wt 可以匹配bat / b1t / b_ ...

  9. Python学习总结12:sys模块

    sys模块常用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互. 1. 导入及函数查看 >>> import sys #导入sys模块 >>&g ...

随机推荐

  1. 远程调试 Asp.Net 项目

    项目部署到产品环境后,难免会发生一些故障,有一些可以在本地测试环境中直接重现,而有一些则无法重现.对于可以在本地测试环境中重现的Bug,开发人员往往能够很迅速地进行问题排查.而对于无法重现的Bug,就 ...

  2. 51NOD 1821 最优集合 栈

    1821 最优集合   一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2, ...

  3. hadoop打jar包

    编译:   javac  -classpath     hadoop的路径下面/hadoop-0.20.0-core.jar       -d     .class文件存放的路径     XXXX.j ...

  4. lsblk df

    df(1) - Linux manual page http://man7.org/linux/man-pages/man1/df.1.html report file system disk spa ...

  5. 常用的Atom插件

    1.simplified-chinese-menu 2.tree-view-finder 3.minimap 4.linter和linter-jshint 5.linter-js-standard 6 ...

  6. YTU 2893: F--Mark的双薪

    2893: F--Mark的双薪 时间限制: 1 Sec  内存限制: 128 MB 提交: 230  解决: 17 题目描述 程序员 Mark 编制的 PPYU 游戏终于上线.Mark 认为自己起早 ...

  7. ios app 上架AppStore

    一.证书的导出      1.1 前期工作        首先你需要有一个苹果的开发者帐号,一个Mac系统.        如果没有帐号可以在打开http://developer.apple.com/ ...

  8. C语言算法

    选择排序法:用第一个数分别和后面的数比较 冒泡排序法:相邻的两个数比较 01.单词首字母大写&统计单词个数 02: 编写一个函数int pieAdd(int n),计算1!+2!+3!+……+ ...

  9. [OS][FS]查看ext3文件系统分区的superblock

    本文将介绍怎样读取一个分区的superblock: 1. 首先我们查看一下在磁盘上有哪些分区,通过fdisk -l 这里有三个分区,我们下面查看/dev/sda3(这是一个device file) 2 ...

  10. Wireshark抓包分析TCP协议

      版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置表明出处!!! 之前有一篇文章介绍了http协议「初识http协议」, http协议协议是基于tcp协议的,所以作者觉得有必要针对tcp ...