调试

第一种方法简单直接粗暴有效,就是用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. Unity即将到来的2D工具

    孙广东  2015.7.5 看了一下对功能介绍的视频,确实功能强大. 可是须要FQ在youtube上观看,所以就下载下来了.能够浏览一下: http://www.iqiyi.com/playlist2 ...

  2. taskTracker和jobTracker 启动失败

    2011-01-05 12:44:42,144 ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker becau ...

  3. 电商系统的演变可以看出架构演变 Dubbo入门 远程过程调用 需要解决的问题

    Dubbo入门---搭建一个最简单的Demo框架 - CSDN博客 https://blog.csdn.net/noaman_wgs/article/details/70214612 Dubbo背景和 ...

  4. Delphi的goto语法

    今天第一次主要到Delphi也有goto语法,特别是其奇怪的label声明.估计主要是用来跳出多重循环,而且还真有人使用这种方式.记个笔记: procedure TForm1.btn3Click(Se ...

  5. POJ1182 食物链 —— 种类并查集

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  6. BZOJ_4177_Mike的农场_最小割

    BZOJ_4177_Mike的农场_最小割 Description Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不 ...

  7. 使用Jquery动态加入对象的集合属性,提交集合属性到表单

    1.设置模型,引入构造函数,初始化集合 public class Person { public Person() //引入构造函数,初始化集合.如果未设置构造函数,集合会出现错误. { Skills ...

  8. ionic2 angular2 模板指令补充

    向div中插入带有html标签的数据   [innerHTML]="item.content"    字符串截取指令                       {{item.de ...

  9. [App Store Connect帮助]八、维护您的 App(4.2)查看评分与评论

    您可以查看 App 的总评分或单个顾客评论.如有必要,您可以针对某条评论报告问题. [注]顾客可以为您的 iOS 和 macOS App 评分并撰写评论,但只能为 Apple TVOS App 评分. ...

  10. X86 Linux 下 SIGBUS 总结

    SIGBUS 在 x86 Linux 上并不多见,但一旦出现,其调用堆栈常常让人摸不着头脑,加之信号问题各平台系统间差异较大,更让人难以理清,这里稍微总结一下 x86 Linux 上大概有哪些情形会触 ...