设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 20633|回复: 5
打印 上一主题 下一主题

【Python 第62课】 调试程序

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-10-21 17:18:14 |只看该作者 |倒序浏览
0.jpg

写代码,不可避免地会出现bug。很多人在初学编程的时候,当写完程序运行时,发现结果与自己预料中的不同,或者程序意外中止了,就一时没了想法,不知道该从何下手,只能反复重新运行程序,期待忽然有次结果就对了。

今天我就来讲讲代码遇到问题时的一些简单处理方法。

1. 读错误信息
来看如下一个例程:
  1. import random
  2. a = 0
  3. for i in range(5):
  4.     b = random.choice(range(5))
  5.     a += i / b
  6. print a
复制代码
这个程序中,i从0循环到4,每次循环中,b是0到4中的一个随机数。把i/b的结果累加到a上,最后输出结果。

运行这段程序,有时候会输出结果,有时候却跳出错误信息:
Traceback (most recent call last):
  File "C:\Users\Crossin\Desktop\py\test.py", line 6, in <module>
    a += i / b
ZeroDivisionError: integer division or modulo by zero

有些同学看见一段英文提示就慌了。其实没那么复杂,python的错误提示做得还是很标准的。

它告诉我们错误发生在test.py文件中的第6行
a += i / b
这一句上。

这个错误是“ZeroDivisionError”,也就是除零错。

“integer division or modulo by zero”,整数被0除或者被0模(取余数)。

因为0不能作为除数,所以当b随机到0的时候,就会引发这个错误。

知道了原因,就可以顺利地解决掉这个bug。

以后在写代码的时候,如果遇到了错误,先别急着去改代码。试着去读一读错误提示,看看里面都说了些啥。

2. 输出调试信息
我们在所有课程的最开始就教了输出函数“print”。它是编程中最简单的调试手段。有的时候,仅从错误提示仍然无法判断出程序错误的原因,或者没有发生错误,但程序的结果就是不对。这种情况下,通过输出程序过程中的一些状态,可以帮助分析程序。

把前面那个程序改造一下,加入一些与程序功能无关的输出语句:
  1. import random
  2. a = 0
  3. for i in range(5):
  4.     print 'i: %d' % i
  5.     b = random.choice(range(5))
  6.     print 'b: %d' % b
  7.     a += i / b
  8.     print 'a: %d' % a
  9.     print
  10. print a
复制代码
运行后的输出结果(每次结果都会不一样):
i: 0
b: 3
a: 0

i: 1
b: 3
a: 0

i: 2
b: 3
a: 0

i: 3
b: 0
Traceback (most recent call last):
  File "C:\Users\Crossin\Desktop\py\test.py", line 8, in <module>
    a += i / b
ZeroDivisionError: integer division or modulo by zero

当b的值为0时,发生了除零错。这次可以更清晰地看出程序出错时的状态。

在真实开发中,程序的结构可能会非常复杂。通过输出调试信息,可以有效地缩小范围、定位错误发生的位置,确认错误发生时的场景,进而找出错误原因。


#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:156630350

面向零基础初学者的编程课
每天5分钟,轻松学编程


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

98

积分

注册会员

Rank: 2

沙发
发表于 2014-3-18 00:00:59 |只看该作者

回帖奖励 +3

支持
最近的心得:程序中多用print,在排查错误的同时 也可以帮助更好的理解程序的运行逻辑。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2014-3-18 11:04:50 |只看该作者
508490571 发表于 2014-3-18 00:00
支持
最近的心得:程序中多用print,在排查错误的同时 也可以帮助更好的理解程序的运行逻辑。 ...

是的,这是个好习惯
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

地板
发表于 2014-9-27 00:33:33 |只看该作者

回帖奖励 +3

善意的建议,一定要保持好习惯。
学习,纯粹。
回复

使用道具 举报

0

主题

1

好友

132

积分

注册会员

Rank: 2

5#
发表于 2015-12-14 17:19:47 |只看该作者

回帖奖励 +3

你说的这种方法很好,经理也多次说过。  get
回复

使用道具 举报

1

主题

0

好友

145

积分

注册会员

Rank: 2

6#
发表于 2017-3-2 18:02:24 |只看该作者
Debug这件事真的是需要大量的经验积累才行。因为错误的种类就有很多种,有些错误,编译器和解释器是不会告诉你的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 17:37 , Processed in 0.016954 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部