第九章异常处理与程序调试ppt课件.ppt

上传人:牧羊曲112 文档编号:2133545 上传时间:2023-01-16 格式:PPT 页数:56 大小:958KB
返回 下载 相关 举报
第九章异常处理与程序调试ppt课件.ppt_第1页
第1页 / 共56页
第九章异常处理与程序调试ppt课件.ppt_第2页
第2页 / 共56页
第九章异常处理与程序调试ppt课件.ppt_第3页
第3页 / 共56页
第九章异常处理与程序调试ppt课件.ppt_第4页
第4页 / 共56页
第九章异常处理与程序调试ppt课件.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《第九章异常处理与程序调试ppt课件.ppt》由会员分享,可在线阅读,更多相关《第九章异常处理与程序调试ppt课件.ppt(56页珍藏版)》请在三一办公上搜索。

1、2023/1/16,1,Python语言编程导论,第十章 异常处理与程序调试,内容提要,概述异常的处理调试使用自带IDEL调试程序,2023/1/16,2,一、概述,在程序执行过程中,遇到出错情况在所难免。有些错误可以预料,可在程序处理中考虑进去;有些错误是意料之外的,例如,若在读取文件其间,计算机上的其他程序已将其删除,如何处理?若程序从网站下载网页时,该网站突然崩溃,如何处理?Python采用的措施是引发异常。异常是一种特殊的错误对象,程序可以捕获并检查它们,以决定如何处理错误。异常可能改变程序的控制流程。根据发生的时机,异常可能导致执行流程跳出函数或进入处理错误的代码块。通常,我们无法确

2、定哪一行可能引发异常,Python提供了一个特殊的异常处理结构,可用于捕获异常,并确保无论是否出现异常都将执行清理代码。,2023/1/16,3,常见的异常类型:,SyntaxError:Python 不能理解程序NameError:局部或全局变量名找不到AttributeError:属性引用失败IndexError:索引引用越界TypeError:操作数的类型不正确ValueError:操作数类型正确,但值非法ZeroDivisionError:被零除FileNotFoundError:文件未找到IOError:IO system 报告故障,2023/1/16,4,例如:,试图存取列表上界之

3、外的元素将引发IndexError如:Test=1,2,3 Test4试图转换不适当的类型将引发TypeError如:int(Test)引用不存在的变量将引发NameError如:a不同的数据类型参加运算而没有强制类型转换将引发TypeError如:a/4,2023/1/16,5,如何处理异常?,什么都不做:替换成缺省值,使程序继续执行Bad idea!用户可能会怀疑结果返回一个“error”值选择一个什么样的错误值?主调程序必须包含检查这种特殊值和处理一系列错误的代码停止执行,发出错误条件信号在Python中即引发异常,捕获异常并处理之,2023/1/16,6,例9-1:传统处理程序出错及P

4、ython处理异常比较,编写函数getRatios(v1,v2)。假定参数v1、v2是等长的数字列表,要求返回一个列表,该列表包含v1i/v2i有意义的值。,2023/1/16,7,使用传统程序设计方法处理错误:,2023/1/16,8,调用及执行:,2023/1/16,9,使用Python异常处理机制实现:,2023/1/16,10,执行:,对比之下,传统处理错误方法的缺点显而易见:,程序难读,因此难以维护和修改效率较低,2023/1/16,11,二、异常的处理,1、tryexcept的使用tryexcept语句用于处理问题语句,捕获可能出现的异常。try子句中的代码块放置可能出现异常的语句

5、,except子句中的代码块处理异常。当异常出现时,Python会自动生成1个异常对象,该对象包括异常的具体信息,以及异常的种类和错误位置。,2023/1/16,12,例如:试图打开不存在的文件,2023/1/16,13,说明:出现了FileNotFoundError异常,例9-2:使用tryexcept捕获FileNotFoundError异常,2023/1/16,14,执行结果:,又如:,2023/1/16,15,同样可以使用tryexcept语句来处理该异常。tryexcept语句后还可以添加1个else子句,当try子句中的代码发生异常时,程序直接跳转到except子句;反之,程序将执

6、行else子句。,例9-3:捕获并处理除数为0的ZeroDivisionError异常,2023/1/16,16,执行结果:,例9-4:异常处理的嵌套,2023/1/16,17,执行结果:,2、tryfinally的使用,tryexcept语句还可以添加1个finally子句,无论异常是否发生,finally子句都会被执行。finally子句通常用于关闭因异常而不能释放的系统资源。,2023/1/16,18,例9-5:使用tryfinally处理异常,2023/1/16,19,执行情况:,2023/1/16,20,课堂练习一:,课堂练习一,2023/1/16,21,3、使用raise抛出异常,

7、当程序中出现错误时,Python会自动引发异常。另外,在程序的任何地方都可以使用raise语句故意引发异常。一旦执行了raise语句,raise语句后的代码将不被执行。raise语句通常用于抛出自定义异常,因为自定义异常并不在Python的控制范围之内,不会被Python自动抛出,应使用raise语句手工抛出。,2023/1/16,22,例9-6:使用raise抛出异常,2023/1/16,23,执行结果:,4、自定义异常,Python允许自定义异常,用于描述Python异常体系中没有涉及的异常情况。自定义异常必须继承Exception类。自定义异常按照命名规范以Error结尾,显式地表示该类

8、是异常类。自定义异常使用raise语句引发,且只能通过手工方式触发。,2023/1/16,24,例9-7:自定义异常,2023/1/16,25,执行结果:,5、assert语句的使用,assert语句用于检测某个条件表达式是否为真。assert语句又称为断言语句,即assert认为检测的表达式永远为真。if语句中的条件判断都可以使用assert语句检测。例如,检测某个元组中元素的个数是否大于1,如果assert语言断言失败,会引发AssertionError异常。,2023/1/16,26,例9-8:assert语句使用,2023/1/16,27,执行结果:,在何处使用断言?,使用断言的目的是

9、为了尽早识别bug且清楚它们是在何处出现的在第一次碰到问题时就捕获它,使调试更容易,而不是之后再追踪不要将断言用于测试之处,但可以作为测试的补充若用户提供了错误输入时应尽可能依靠抛出异常去处理,而断言常用于检查参数或值的类型。,2023/1/16,28,6、多种异常的处理,可在except子句中指定多种异常来处理多种异常;如果要分别处理不同的异常,可使用多个except子句;如果在except子句中没有指定异常,它将捕获所有异常。,2023/1/16,29,例9-9:处理多种异常,2023/1/16,30,执行结果:,2023/1/16,31,执行结果:,课堂练习二:,课堂练习二,2023/1

10、/16,32,三、调试,如果总能写出正确的代码,并在第一次第一次测试时就能正确执行,当然很好。但实际编程过程中并不总是如此顺利。如何测试代码是否正确,常用的方法有:黑盒测试通过特定规范执行路径白盒测试通过代码执行路径将调试作为一个搜索过程使用二分查找的方法,分离并检查错误来源,2023/1/16,33,1、测试和调试,在调试程序过程中我们需要一些方法:测试方法使用不同的例子运行代码看其是否正确的方法调试方法已经发现程序中有问题,如何修正程序的方法,2023/1/16,34,何时进行测试?何时进行调试?,实际上,如果我们能弄清楚如何设计代码,那么测试和调试会更加简单。优秀的程序员会有这样的经验:

11、将代码分解成独立的模块,从而独立地测试和调试;写出好的文档(写明输入、输出的期望是什么;即使代码没有执行对测试的限制,这种文档也是有价值的);记录下可能的各种假设;,2023/1/16,35,测试之前要完成的工作:,确保代码可以运行剔除语法错误剔除静态语义错误事实上,Python解释器可以自动处理上述两种错误准备一套预期结果(即对于一个特定的输入,期待会有怎样的输出),2023/1/16,36,2、测试套件,我们希望找到一系列输入,它们很有可能暴露错误,且不会花太多时间,但却十分有效,这就是所谓测试套件。将输入分解为子集,为代码正确性提供等效信息;构造测试套件,其中至少包含每个子集的一个元素;

12、运行测试套件。,2023/1/16,37,例9-10:测试套件应用,输入空间是所有的整数对可能的子集:x为正,y为正x为负,y为负x为正,y为负x为负,y为正x=0,y=0 x=0,y!=0 x!=0,y=0,2023/1/16,38,输入空间的划分原则:,上例中当然也可以有其他的输入选择,例如x是质数,y不是;y是质数,x不是;x和y都是质数;x和y都不是质数。但这与问题不相关。实际上输入空间经常具有自然边界:如:整数有正、负、零值;根据这个观点可以将测试数据划分为9个子集(见上页):将x=0,y!=0划分为x=0,y为正数和x=0,y为负数x!=0,y=0也同样划分,2023/1/16,3

13、9,测试方法:,随机测试代码的正确率随测试次数的增加而增加;黑盒测试:在测试时,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收和正确的输出白盒测试:是通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正。,2023/1/16,40,3、黑盒测试,测试套件的设计使人们无需查看代码,其优点为:编程者以外的其他人也可以使用其进行测试;可以避免编程者潜在的偏见,使得发现错误更为容易;同一

14、个测试套件可以被重复利用,即使改变了程序代码。,2023/1/16,41,4、白盒测试,使用代码本身引导测试用例的设计;一个好的白盒测试套件,也被称为穷举路径测试,代码片段的每一个路径至少都被检测一次;当然,即使是一个穷举路径测试也可能遗漏错误,这取决于例子的选择。,2023/1/16,42,例9-11:求某个数的绝对值(使用白盒测试),选择测试套件-2,2,这是穷举路径;但是遗漏了检测abs(-1);测试的边界应该选择-2,-1,2修改程序(if x=-1),2023/1/16,43,白盒测试的经验法则:,执行所有if语句的两条分支;确保每一个except语句被执行;对于每一个for循环,需

15、要测试以下情况:循环一次都未被执行;循环体只被执行一次;循环体被执行一次以上对于每一个while循环,需要测试以下情况:与for循环测试相同还要测试所有退出循环的情况对于递归,要测试没有递归、有一次递归和多次递归的情况。,2023/1/16,44,5、将二分查找思路用于调试,例9-12:用二分查找思路调试判回文程序。,2023/1/16,45,执行情况:,2023/1/16,46,执行情况:,错误肯定在此之前,2023/1/16,47,执行情况:,说明silly(n)已经没问题,再去看isPal(x),2023/1/16,48,错误肯定在此之前,执行情况:,2023/1/16,49,执行情况:

16、,说明错误在此之前,2023/1/16,50,执行情况:,应将x的副本赋值给temp,修改完成后的程序:,2023/1/16,51,执行结果:,四、使用自带IDEL调试程序,IDLE是Python自带的一个简易的IDE,具有程序调试的功能,并且提供交互环境和脚本文件调试两种模式。打开IDLE后默认是一个交互环境,可以直接编写Python代码并且能试试查看输出,如图9-1所示。单击Debug|Debugger会弹出Debug Control调试界面,如图9-2所示。界面上有5个按钮:Go(运行)、Step(单步调试)、Over(跳过)、Out(跳出)和Quit(退出)。还有4个可选项:Stack(堆栈)、Source(源码)、Locals(局部变量)和Globals(全局变量)。,2023/1/16,52,图9-1:IDLE交互环境,2023/1/16,53,图9-2:Debug Control界面,2023/1/16,54,例9-13:编写两个数的除法函数并调试(在交互环境下调试),2023/1/16,55,脚本文件调试:,2023/1/16,56,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号