Python 小技巧 029:调试程序
调试 Python 程序在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因为程序会直接停止,并且给出错误提示。而对于逻辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的。所以作为一名程序员,掌握一定的程序调试方法,是很有必要的。
1. 使用自带的 IDLE 进行程序调试
多数的开发工具都提供了程序调试功能。例如 Python 自带的 IDLE 提供了调试功能。使用 IDLE 进行程序调试的基本步骤如下:
(1) 打开 IDLE (Python Shell),在主菜单上选择 Debug → Debugger 菜单项,将打开 Debug Control 对话框(此时该对话框基本是空白的),同时 Python Shell 窗口中将显示 (表示已经处于调试状态)。如下图:
(2) 在 Python Shell 窗口中,选择 File → Open 菜单项,打开要调试的文件。这里打开我新创建的 demo.py(作为演示),然后添加需要的断点。
说明:设置断点后,程序执行到断点时就会暂时中断执行,程序可以随时继续。
添加断点的方法:在想要添加断点的行上,单击鼠标右键,在弹出的快捷菜单中选择 Set Breakpoint 菜单项。添加断点的行将以黄色底纹标记,如下图:
说明:如果想要删除已经添加的断点,可以选中已经添加断点的行,然后单击鼠标右键,在弹出的快捷菜单中选择 Clear Breakpoint 菜单项。
(3) 添加所需的断点(添加断点的原则是:程序执行到这个位置时,想要查看某些变量的值,就在这个位置添加一个断点)后,按下快捷键 F5 执行程序,程序会先停留在第 1 行,单击 Go 程序将会一直执行到断点处。这时 Debug Control 对话框中将显示程序的执行信息。选中 Globals 复选框,将显示全局变量,默认只显示局部变量。此时的 Debug Control 对话框如下图:
说明:调试对话框的 Go 按钮用于让程序执行到断点处;Step 按钮用于进入要执行的函数;Over 按钮表示单步执行;Out 按钮表示跳出所在的函数;Quit 按钮表示结束调试。
(4) 继续单击 Go 按钮,将执行到下一个断点,查看变量的变化,直到全部断点都执行完毕并且程序退出。
程序调试完毕后,可以关闭 Debug Control 窗口,此时在 Python Shell 窗口中将显示 (表示已经结束调试)。
2. 使用 assert 语句调试程序
Python 提供了 assert 语句来调试程序。assert 的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。assert 语句的语法格式如下:
assert expression[, reason]
参数说明:
参数说明
expression条件表达式,如果该表达式的值为 True 时什么都不做,如果为 False 则抛出 AssertionError 异常。
reason可选参数,作为错误信息,如果不指定将没有错误信息。指定该参数是为了以后更好地知道哪里出现了问题。
例如下面的代码:
a = 2
b = 0
assert a == 2, 'a != 2'
assert b != 0, 'b == 0'
该代码将会抛出异常:
AssertionError: b == 0
因为 b != 0 为 False,所以抛出错误信息为 'b == 0' 的 AssertionError 异常。
通常情况下,assert 语句可以和异常处理语句结合使用。所以,可以将代码修改为以下内容:
a = 2
b = 0
try:
assert a == 2, 'a != 2'
assert b != 0, 'b == 0'
except AssertionError as e:
print('出现错误!', e)
这样,再执行程序就不会抛出异常,而是显示如下图所示的提示信息:
assert 语句只在调试阶段有效。我们可以通过在执行 python 命令时加入 -O 参数来关闭 assert 语句。例如在命令行窗口输入以下代码:
可以看到,并未打印提示信息,说明没有抛出异常,assert 语句已经关闭。 @小甲鱼 申精{:10_256:} 能申精的一定很好(来一个鱼币) henry2018 发表于 2019-9-28 08:30
能申精的一定很好(来一个鱼币)
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗{:10_256:} 看看 zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗
5+5=10(min)
??? _2_ 发表于 2019-9-28 14:51
5+5=10(min)
???
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)
你数学不好 zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)
{:10_269:}{:10_269:}{:10_269:} zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)
50+15=65(min) _2_ 发表于 2019-9-28 14:56
50+15=65(min)
Yes. 下了 “血本” 了{:5_97:} 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. _2_ 发表于 2019-9-28 15:00
Only 65 minutes.
I write a post about 3 days.
CuPy? zltzlt 发表于 2019-9-28 15:01
CuPy?
I don't did that.
It's very difficult. _2_ 发表于 2019-9-28 15:02
I don't did that.
It's very difficult.
What have you done? zltzlt 发表于 2019-9-28 15:01
CuPy?
And my homework is so many. zltzlt 发表于 2019-9-28 15:03
What have you done?
It will exam at 2019/10/8. _2_ 发表于 2019-9-28 15:05
It will exam at 2019/10/8.
We will have an exam tomorrow. 建议不要搞隐藏内容...... zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗
幸苦了 henry2018 发表于 2019-9-28 17:29
幸苦了
{:10_256:}
页:
[1]
2