鱼C论坛

 找回密码
 立即注册
查看: 4931|回复: 30

[技术交流] Python 小技巧 029:调试程序

[复制链接]
发表于 2019-9-28 08:19:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
调试 Python 程序


在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因为程序会直接停止,并且给出错误提示。而对于逻辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的。所以作为一名程序员,掌握一定的程序调试方法,是很有必要的


1. 使用自带的 IDLE 进行程序调试

多数的开发工具都提供了程序调试功能。例如 Python 自带的 IDLE 提供了调试功能。使用 IDLE 进行程序调试的基本步骤如下:

(1) 打开 IDLE (Python Shell),在主菜单上选择 Debug → Debugger 菜单项,将打开 Debug Control 对话框(此时该对话框基本是空白的),同时 Python Shell 窗口中将显示 [DEBUG ON](表示已经处于调试状态)。如下图:

1.png

(2) 在 Python Shell 窗口中,选择 File → Open 菜单项,打开要调试的文件。这里打开我新创建的 demo.py(作为演示),然后添加需要的断点。

说明:设置断点后,程序执行到断点时就会暂时中断执行,程序可以随时继续。

添加断点的方法:在想要添加断点的行上,单击鼠标右键,在弹出的快捷菜单中选择 Set Breakpoint 菜单项。添加断点的行将以黄色底纹标记,如下图:

搜狗截图20190927222640.png

说明:如果想要删除已经添加的断点,可以选中已经添加断点的行,然后单击鼠标右键,在弹出的快捷菜单中选择 Clear Breakpoint 菜单项。

(3) 添加所需的断点(添加断点的原则是:程序执行到这个位置时,想要查看某些变量的值,就在这个位置添加一个断点)后,按下快捷键 F5 执行程序,程序会先停留在第 1 行,单击 Go 程序将会一直执行到断点处。这时 Debug Control 对话框中将显示程序的执行信息。选中 Globals 复选框,将显示全局变量,默认只显示局部变量。此时的 Debug Control 对话框如下图:

搜狗截图20190927224118.png

说明:调试对话框的 Go 按钮用于让程序执行到断点处;Step 按钮用于进入要执行的函数;Over 按钮表示单步执行;Out 按钮表示跳出所在的函数;Quit 按钮表示结束调试。

(4) 继续单击 Go 按钮,将执行到下一个断点,查看变量的变化,直到全部断点都执行完毕并且程序退出。

程序调试完毕后,可以关闭 Debug Control 窗口,此时在 Python Shell 窗口中将显示 [DEBUG OFF](表示已经结束调试)。


2. 使用 assert 语句调试程序

Python 提供了 assert 语句来调试程序。assert 的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。assert 语句的语法格式如下:

  1. assert expression[, reason]
复制代码

参数说明:

参数说明
expression条件表达式,如果该表达式的值为 True 时什么都不做,如果为 False 则抛出 AssertionError 异常。
reason可选参数,作为错误信息,如果不指定将没有错误信息。指定该参数是为了以后更好地知道哪里出现了问题。

例如下面的代码:

  1. a = 2
  2. b = 0
  3. assert a == 2, 'a != 2'
  4. assert b != 0, 'b == 0'
复制代码

该代码将会抛出异常:
  1. AssertionError: b == 0
复制代码

因为 b != 0 为 False,所以抛出错误信息为 'b == 0' 的 AssertionError 异常。



通常情况下,assert 语句可以和异常处理语句结合使用。所以,可以将代码修改为以下内容:

  1. a = 2
  2. b = 0
  3. try:
  4.     assert a == 2, 'a != 2'
  5.     assert b != 0, 'b == 0'
  6. except AssertionError as e:
  7.     print('出现错误!', e)
复制代码

这样,再执行程序就不会抛出异常,而是显示如下图所示的提示信息:

搜狗截图20190928081524.png



assert 语句只在调试阶段有效。我们可以通过在执行 python 命令时加入 -O 参数来关闭 assert 语句。例如在命令行窗口输入以下代码:

搜狗截图20190928081750.png

可以看到,并未打印提示信息,说明没有抛出异常,assert 语句已经关闭。

评分

参与人数 2荣誉 +1 鱼币 +2 收起 理由
一个账号 + 1 + 1 不错!支持zltzlt!
henry2018 + 1 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-28 08:20:10 | 显示全部楼层
@小甲鱼 申精
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 08:30:17 | 显示全部楼层
能申精的一定很好(来一个鱼币)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 08:48:59 | 显示全部楼层
henry2018 发表于 2019-9-28 08:30
能申精的一定很好(来一个鱼币)

从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 10:15:00 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-28 14:51:34 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗

5+5=10(min)
???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 14:52:47 | 显示全部楼层

22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)

你数学不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-28 14:55:17 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 14:56:01 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)


50+15=65(min)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 14:56:46 | 显示全部楼层

Yes. 下了 “血本”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 15:00:39 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)


Only 65 minutes.
I write a post about 3 days.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 15:01:38 | 显示全部楼层
_2_ 发表于 2019-9-28 15:00
Only 65 minutes.
I write a post about 3 days.

CuPy?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 15:02:53 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 15:01
CuPy?

I don't did that.
It's very difficult.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 15:03:34 | 显示全部楼层
_2_ 发表于 2019-9-28 15:02
I don't did that.
It's very difficult.


What have you done?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 15:04:22 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 15:01
CuPy?

And my homework is so many.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 15:05:02 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2019-9-28 15:03
What have you done?

It will exam at 2019/10/8.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 15:05:52 | 显示全部楼层
_2_ 发表于 2019-9-28 15:05
It will exam at 2019/10/8.

We will have an exam tomorrow.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 15:58:15 | 显示全部楼层
建议不要搞隐藏内容......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-28 17:29:58 | 显示全部楼层
zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗

幸苦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-28 17:30:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 16:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表