课程首页 › 第10章 › 第53课

第53课 调试

第10章 警报,警报,发现异常· 知识点:异常与调试 · 原书 10.3

发生异常运行

输入被除数12,除数0,程序运行结果如下:

输入被除数:12

输入除数:0

division by zero

我进行了除法运算

(1)程序中使用了try-finally,定义了无论是否发生异常,都要执行的代码块我进行了除法运算。

print("")

语法如下:

插图

(2)从程序运行结果可以看出,除法函数出现异常的时候和正常执行的时候,都执行了finally后面的代码我进行了除法运算。

print("")

在Python中,还有一个神器可以帮助我们了解程序的运行,帮助我们解决程序存在的Bug,那就是调试。

插图

调试就是跟踪程序运行,查看程序变量的变化,运用它可以很有效地帮助我们查找程序中的Bug。那么我们怎么使用IDLE进行调试呢?下面就来学习调试。

下面要调试的程序是找出数字中的最大值(调试代码.py)。

插图

调试准备工作:

(1)依次单击IDLE菜单栏File→New File选项,新建一个文件。

(2)编写上面的代码,依次单击IDLE菜单栏File→Save选项将文件保存为max.py。

小贴士

调试的过程中,会出现3个页面,大家要按照步骤切换到相应的界面哦,不然就找不到相应的菜单栏了。

仔细看好每个页面的样子,注意它们菜单栏的区别。

·调试代码.py代码界面。

插图

·Python Shell界面。

插图

·代码调试窗口。

插图
插图

正式开始我们的调试之旅。

在调试代码文件中,把鼠标放在要设置断点的代码上并右击,可以

.py看到set Breakpoint(设置断点)和clear Breakpoint(清除断点)。断点就是调试过程中程序要停止的地方。

插图
插图

在调试代码.py文件中,在max()函数中的max=num和主程序中的maxNum=max(4,5,23,22,1,89,455,360,888,222,111)这两行代码处设置断点。

设置成功后,这两行会出现黄色背景。

插图

依次单击菜单栏Run→Python Shell选项。

插图

进入Python Shell界面。

插图

在Python Shell界面中,依次单击菜单栏Debug→Debugger选项。

插图

弹出调试窗口。

插图

勾选以下4个复选按钮,表示在调试界面要展示的内容。

·Stack:程序的堆栈调用层次。

·Locals:查看程序中的局部变量的变化。

·Source:跟进源程序,就是显示当前运行到哪一行代码。

·Globals:查看程序中的全局变量的变化。

在调试窗口中,有很多按钮,分别说明一下。

·Go:单击Go按钮将使程序正常执行直至终止,但是如果设置了断点,则会停在断点处。

·Step:单击Step按钮,使程序执行下一行代码,然后暂停,非常适合一行一行运行程序进行检查。如果全局变量或者局部变量的值发生了

变化,则会在相应区域展示。如果下一行是一个函数调用,则会跳转到函数的第一行代码。

·Over:单击Over按钮,和Step按钮一样,执行下一行代码。不同的是,如果下一行代码是函数调用,则不会进入函数内部,直接执行主程序中的函数调用语句,获取函数返回结果。

·Out:如果使用Step按钮进入了一个函数,可以使用Out按钮从当前函数跳出来,直接回到主程序中调用函数的地方。

·Quit:Quite按钮将马上终止该程序。如果需要完全停止调试,不必继续执行剩下的程序,就单击Quit按钮。

在Python Shell界面上出现了DEBUG ON,说明已经进入了调试模式。

>>>[DEBUG ON]

切换到max.py文件中,依次单击菜单栏Run→Run Module选项,会看到调试器暂停在文件的第一行。执行的当前代码行背景会变成灰色。

插图

同时,在调试窗口中展示了堆栈信息以及全局变量信息。在

globals globals中你会发现一些没有定义过的全局变量,例如__builtins__、__doc__、__file__等,它们都是Python在运行程序时自动设置的变量。

插图
插图

程序暂停在第一行,直到我们单击以下5个按钮中的一个:Go、Step、Over、Out或Quit才会有变化。

下面我们来试试Step按钮的效果。大家可以尝试一下其他按钮。

第一行

单击Step按钮,程序跳转到主程序的第一行。

插图

第二行

在主程序的第一行调用了max()函数,所以继续单击Step按钮,会跳转到max()函数的第一行。

插图

同时调试窗口中展示了局部变量nums的值为(4,,,,,,

5 23 22 1 89,,,455 360 888,222 111)。

第三行

接着单击Step按钮,会继续一行一行往下执行,这次执行的代码为

for num in nums:。
插图

在调试窗口中增加了局部变量max=0。

第四行

接着单击Step按钮,会继续一行一行往下执行,这次执行的代码为

,对比和的大小。

if num>max num max
插图

在调试窗口中可以看到,增加了num变量的值为4。

第五行

接着单击Step按钮,会继续一行一行往下执行。

直至程序执行完成。调试结束在Python Shell中会有DEBUG OFF标识。

插图

观察得很仔细呢,因为我们刚刚选择的是Step按钮,所以代码是一步一步执行的,很多步骤感觉对调试程序没有帮助,设置的断点也没有派上用场。

运用断点

如果要调试的程序代码量特别大,就不可能使用Step按钮一步一步地执行代码查看程序的变化,这时可以选择使用Go按钮,查看指定代码行的程序和具体数据的变化。

单击Go按钮,设置的断点就派上用场了,程序会停在断点的位置,可以更加方便地观察程序在断点处的变化。

异常与调试小结

(1)try-except代码块捕获异常,语法如下:

插图

(2)使用traceback模块打印详细的异常信息。

(3)使用try-except代码块捕获多个异常,语法如下:

插图

(4)使用try-except-else代码块将没有异常时需要做的事情写在else后面。语法如下:

插图

(5)使用try-finally定义了无论是否发生异常,都要执行的代码块

我进行了除法运算print("")。语法如下:

插图

(6)通过raise语句显式地抛出异常,语法如下:

插图

(7)自定义异常类。

(8)学习调试程序。

异常与调试小挑战

(1)以下代码会抛出异常,请使用Python异常处理捕获异常,并且输出提示:索引超出数组范围了。

插图

(2)当输入的年龄小于0的时候,是不对的,手动触发一个异常,并且提示:年龄一定是大于0的哦。

插图

(3)调试比大小算法,看看是怎么比大小的,注意观察和的

Python a b数值变化。

插图

第11章 汇聚功能的模块

插图

当我组装书架的时候,总会搬出工具箱,拿出里面的螺丝刀,将木板组合起来拧上螺丝,我的书架也就组装完成了。

模块就像工具箱,里面装着各种功能的工具,编写程序的时候可以直接使用。

之前的海龟画图,还有随机数,它们都是模块。有了这

turtle random些模块,当我们需要画图的时候,就不需要重新编写中的功能

turtle了,而是直接调用相关功能就可以了。