第53课 调试
发生异常运行
输入被除数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了,而是直接调用相关功能就可以了。





