调试

第一种方法简单直接粗暴有效,就是用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. 初步学习C++中的继承关系

    继承机制是面向对象程序设计使代码能够复用的最重要的手段,它同意程序猿在保持原有类特性的基础上进行扩展,添加功能. 这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂 ...

  2. bzoj3109【CQOI2013】新数独

    3109: [cqoi2013]新数独 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 365  Solved: 229 [Submit][Statu ...

  3. PL/SQL Developer导入导出Oracle数据库方法

    前一篇博客介绍了Navicat工具备份Oracle的方法.这篇博客介绍一下使用PL/SQL Developer工具导入导出Oracle数据库的方法. PL/SQL Developer是Oracle数据 ...

  4. Calling a parent window function from an iframe

    I want to call a parent window JavaScript function from an iframe. <script>function abc(){ ale ...

  5. POJ3177 Redundant Paths —— 边双联通分量 + 缩点

    题目链接:http://poj.org/problem?id=3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total ...

  6. YTU 1074: You are my brother

    1074: You are my brother 时间限制: 1 Sec  内存限制: 128 MB 提交: 10  解决: 7 题目描述 Little A gets to know a new fr ...

  7. CentOS 7下修改rabbitmq打开文件数量方法

    以下为使用systemd的修改方法:   1.系统层修改: 通过修改sysctl配置,提高系统的打开文件数量 vim /etc/sysctl.conf,添加: fs.file-max = 65535 ...

  8. 四:网络--NSURLConnection基本使用

    一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... ...

  9. 【TJOI 2014】 上升子序列

    [题目链接] 点击打开链接 [算法] 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i] ...

  10. bzoj 4711 小奇挖矿 —— 树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 就是树形DP,然而也想了半天才把转移想清楚: f[x][j][0] 表示 x 去上面 ...