版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计及上机实验主讲:杨薇
Python错误和异常处理第10章10.1程序的错误10.2程序的基本调试方法10.3异常10.4断言处理10.5案例实战10.6课后习题错误与异常异常类异常处理断言本章重点自定义异常和抛出异常本章难点1.语法错误Python程序的语法错误是指其源代码中的拼写语法错误,这些错误导致Python编译器无法把Python源代码转换为字节码,故也称之为编译错误。当程序中包含语法错误时,编译器将现实SyntaxError错误信息。通过分析编译器抛出的运行时错误信息,仔细分析相关位置的代码,可以定位并修改程序错误。程序的错误10.1Python程序的错误通常可以分为3中类型,即语法错误、运行时错误和逻辑错误。2.运行时错误Python程序的运行时错误是在解释执行过程中产生的错误。例如,如果程序中没有导入相关的模块,解释器将在运行时抛出NameError错误信息;如果程序中包括零除运算,解释器将在运行时抛出ZeroDivisionError错误信息;如果程序中试图打开不存在的文件,解释器在运行时抛出FileNotFoundError错误信息。通过分析解释器抛出的运行时错误信息,仔细分析相关位置的代码,可以定位并修改程序错误。程序的错误10.13.逻辑错误Python程序的逻辑错误是程序可以执行,但执行结果不正确。对于逻辑错误,Python解释器无能为力,需要用户根据结果来调试判断。程序的错误10.1程序的基本调试方法10.2在程序实际运行之前,查找和修正其错误的过程称为调试(debugging)。程序的调试主要包括三个方面的调试,分别为语法错误的调试、运行时错误的调试和逻辑错误的调试。1.语法错误的调试对于语法错误,在编译时会给出错误提示,Python解释器会直接抛出异常,用户可以根据输出的异常信息修改程序代码。程序的基本调试方法10.22.运行时错误的调试对于运行时错误,Python解释器也会抛出异常,在代码中可以通过try...except语句捕获并处理。如果在程序中没有try...except语句,则Python解释器将直接打印出异常信息。程序的基本调试方法10.23.逻辑错误的调试逻辑错误的调试方法包括断电跟踪、输出信息等方法,有的集成开发环境(IDLE)可以设置断点并查看变量等。通过print语句输出程序运行过程中变量的值是观察和调试程序运行逻辑正确性的有效方法。异常10.3异常是程序运行过程中产生的错误,在程序解析时没有出现错误,即语法正确,但在运行期间出现错误的情况即为异常。引发异常的原因很多,除以零、溢出异常、下标越界、不同类型的变量运算、内存错误等都会引发异常。Python语言采用结构化的异常处理机制,异常处理机制已经成为许多现代程序设计语言处理错误的标准模式,在程序运行过程中,如果产生错误,将抛出异常。10.3.1什么是异常异常10.3在Python中,异常通常可以用于各种用途,下面是它最常见的5种角色。10.3.2异常的角色1.错误处理每当在运行过程中检测到程序错误时,Python就会引发异常。可以在程序代码中捕捉和相应错误,或者忽略已发生的异常。但如果忽略错误,Python默认的异常处理行为将启动;停止程序,打印出错误消息。如果不想启动这个默认行为,就要写try语句来捕捉异常并从异常中中恢复,当检测到错误时,Python会跳到try处理器,而程序在try之后会重新继续执行。异常10.310.3.2异常的角色2.事件通知异常也可以用于发出有效的状态信号,而不需要在程序间传递结果标志位,或者刻意对其进行测试。例如搜索的过程可能在失败时引发异常,而不是返回一个整数结果代码。异常10.310.3.2异常的角色3.特殊情况处理有时发生了某种很罕见的情况,很难调整代码去处理,通常会在异常处理器中处理这些罕见的情况,从而省去编写应对特殊情况的代码。异常10.310.3.2异常的角色4.终止行为try/finally语句可确保一定会进行需要的结束运算,无论程序中是否有异常。5.非常规控制流程异常是一种高级的goto语句,它可以作为实现非常规的控制流程的基础。Python中没有goto语句,但是异常有时候可以充当类似的角色。异常10.310.3.3内置的异常类Python中有很多内置的异常类,常见的内置异常有ZeroDivisionError、NameError、TypeError等,这些异常称为标准异常。还有一类异常是用户自定义的。异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,如果Python解释器无法继续执行程序,就会抛出一个异常。这时就需要捕获并处理异常,否则解释器会终止程序的执行。在Python中,异常是以对象的形式实现的,BaseException类是所有的异常类的父类(也称基类),而它的子类Exception类则是所有内置异常类和用户自定义异常类的父类。Python中常见的异常类型如表10-1所示。异常10.3异常10.310.3.4捕获指定异常Python异常的捕获使用try...except...结构,把可能发生异常的语句放在try子句里,用except子句来处理异常,每一个try都必须至少对应一个except。try...except...语法格式如下:try:可能引发异常的语句块except异常类型名称:进行异常处理的语句块异常10.3例10-1
try...except应用示例。s="Hello
Python!"try
:print(s[100])except
IndexError:print("IndexError...")print("Continue")try子句中打印一个不存在的字符串的索引值,except捕获到这个异常,输出结果:IndexError...Continue异常10.3如果没有对异常进行任何预防,那么在程序执行过程中发生IndexError异常时,就会中断程序,输出异常提示信息"IndexError:stringindexoutofrange"。如果进行了异常处理,那么当程序发生IndexError异常时,Python解释器会自动寻找except语句,except捕获这个异常,执行异常处理代码,之后程序继续往下执行。这种情况下,不会中断程序。异常10.310.3.5捕获多个异常在实际开发中,同一段代码可能会抛出多个异常,需要针对不同的异常类型进行相应的处理。为了支持多个异常的捕获和处理,Python提供了带有多个except的异常处理结构。捕获多个异常有以下三种方式。(1)第1种是一个except同时处理多个异常类型,不区分优先级,格式如下:try:可能引发异常的语句块except(<异常类型1>,<异常类型2>,…):进行异常处理的语句块(2)第2种是区分异常类型的优先级,格式如下:try:可能引发异常的语句块except<异常类型1>:进行异常处理的语句块except<异常类型2>:进行异常处理的语句块...异常10.3这种异常处理结构的语法规则是:(1)执行try子句下的语句,如果引发异常,则执行流程会跳到第1个except语句。(2)如果第1个except中定义的异常与引发的异常匹配,则执行该except中的语句。(3)如果引发的异常不匹配第1个except,则会依次搜索后面的except子句。一旦某个except捕获了异常,后面剩余的except子句将不会再执行。(4)如果所有的except都不匹配,异常会传递到调用本代码的外层try代码中。异常10.3try:num1=input("请输入第1个数:")num2=input("请输入第2个数:")print(int(num1)/int(num2))except
ZeroDivisionError:print("第2个数不能为0")except
ValueError:print("只能输入数字")例10-2捕获异常示例。运行程序,输入0和a,输出结果为:请输入第1个数:0请输入第2个数:a只能输入数字异常10.3(3)第3种是捕获所有类型的异常。BaseException是所有内建异常的基类,通过它可以捕获所有类型的异常,KeyboardInterrupt、SystemExit和Exception是从它直接派生出来的子类。按Ctrl+C会抛出KeyboardInterrupt类型的异常,sys模块的sys.exit()会抛出SystemExit类型的异常。其他所有的内建异常都是Exception的子类。当程序需要捕获所有异常时,可以使用BaseException,代码格式为:try:可能引发异常的代码块exceptBaseExceptionase:进行异常处理的代码块异常10.3例10-3编写一个函数,将输入的参数值转换为float类型,转换时检测参数的有效性。defsafe_float(num):#定义一个函数
try:retval=float(num)exceptBaseExceptionase:print(e)else:print(retval)safe_float('xyz')#把字符串传给函数safe_float(1)safe_float("123")safe_float("[]")运行结果为:couldnotconvertstringtofloat:'xyz'1.0123.0couldnotconvertstringtofloat:'[]'异常10.310.3.6未捕获到异常带else子句的异常处理结构是一种特殊形式的选择结构。如果try子句中的代码抛出了异常,并且被某个except捕获,则执行相应的异常处理代码,这种情况下不会执行else中的代码;如果try中的代码没有抛出任何异常,则执行else子句中的代码块。如果使用else子句,那么必须放在所有的except子句之后,语法格式如下:try:可能引发异常的代码块except<异常类型1>:异常处理代码块except<异常类型2>:异常处理代码块...else:代码块#try子句中没有发生异常,则执行此代码块异常10.3例10-4
try...except...else应用示例。nation_list=['China','America','England','France']whileTrue:n=int(input("请输入字符串的序号:"))try:print(nation_list[n])exceptIndexErrorase:print("列表元素的下标越界,请重新输入字符串的序号")else:break运行结果为:请输入字符串的序号:9列表元素的下标越界,请重新输入字符串的序号请输入字符串的序号:2England异常10.310.3.7try...except...finally
语句无论是否发生异常,try...except...finally语句都会执行finally子句中的语句块,常用来做一些清理工作以释放try子句中申请的资源。异常10.3例10-5
try...except...finally应用示例。s='Python'try:int(s)except
Exception
as
e:print(e)else
:print("try
内代码块没有异常则执行")finally:print("无论异常发生与否,都会执行该
finally
语句")运行程序,输出信息如下:invalid
literal
for
int()
with
base
10:'Python'无论异常发生与否,都会执行该finally语句注意:如果try子句中的异常没有被捕获和处理,或者except子句、else子句中的代码出现了异常,那么这些异常将会在finally子句执行完后再次被抛出。异常10.310.3.8自定义异常和抛出异常实际开发中,系统提供的异常类型不一定能够满足开发的需要,这时可以创建自定义的异常类。自定义异常类继承自Exception类,可以直接继承,也可以间接继承。内置的异常触发时,系统会自动抛出异常,比如NameError。但用户自定义的异常需要用户决定什么时候抛出。当程序出现异常,Python会自动抛出异常,也可以通过raise语句显式地抛出异常,基本格式如下:
raise异常类
#引发异常时会隐式的创建对象
raise异常类对象
#引发异常类实例对象对应的异常raise唯一的参数指定要被抛出的异常,它必须是一个异常的实例或者是异常的类(Exception的子类)。大多数异常的名字都以“Error”结尾,所以实际命名时尽量跟标准的异常命名一致。一旦执行了raise语句,其后的语句将不能执行。异常10.3例10-6
raise语句强行抛出异常示例。classCustomError(Exception):#自定义异常类,继承Exceptiondef__init__(self,ErrorInfo,name,age):super().__init__(self)#初始化父类
self.errorinfo=ErrorInfo=nameself.age=agedef__str__(self):#_str_方法是类的特殊方法,功能是转换为字符串
returnself.errorinfoif__name__=="__main__":try:raiseCustomError('客户异常',"张三",18)#主动抛出异常,即实例化一个异常类
exceptCustomErrorase:#捕获CustomError类携带的信息
print(e,,e.age)运行结果为:客户异常张三18异常10.3本例自定义继承自Exception的异常类CustomError,它有三个属性(errorinfo、name和age)和一个方法__str__(打印实例化对象调用)。运行程序,raise主动抛出异常,即实例一个异常类,同时捕获CustomError异常的信息并输出捕获的异常的信息。断言处理10.4用户在编写程序时,在调试阶段往往需要判断代码执行过程中变量的值等信息(例如对象是否为空、数值是否为0等)。用户可以使用print()函数打印输出结果,也可以通过断点跟踪调试查看变量,但使用断言更加灵活、高效。断言一般用于下列情况。(1)前置条件断言,代码执行之前必须具备的特性。(2)后置条件断言,代码执行之后必须具备的特性。(3)前后不变断言,代码执行前后不能变化的特性。断言的主要功能是帮助程序员调试程序,以保证程序运行的正确性。断言一般在开发调试阶段使用,即在调试模式时断言有效,在优化模式运行时自动忽略断言。与之相对,异常处理则是通过错误的抛出和捕获机制来保证程序的健壮性,异常处理贯穿于程序开发运行的各个阶段。断言处理10.41.assert语句与AssertionError类使用关键字assert可以声明断言。断言的声明有下面两种形式:assert<布尔表达式>#简单形式assert<布尔表达式>,<字符串表达式>#带参数形式其中,<布尔表达式>的结果为一个布尔值,<字符串表达式>是断言失败时输出的失败消息。在调试模式下,如果<布尔表达式>为假,则抛出AssertionError对象实例。例10-7断言示例。a=int(input("请输入整数a:"))b=int(input("请输入整数b:"))assertb!=0,'除数不能为0'c=a/bprint(a,'/',b,'=',c)断言处理10.4运行结果为:请输入整数a:1请输入整数b:51/5=0.2请输入整数a:5请输入整数b:0Traceback(mostrecentcalllast):File"I:/10-7.py",line3,in<module>assertb!=0,'除数不能为0'AssertionError:除数不能为0断言处理10.42.启用/禁用断言通常Python运行在调试阶段,程序中的断言语句可以帮助程序员调试。在正式运行时,使用运行选项-O以优化模式运行来禁用断言,从而提高程序效率。案例实战10.5例10-8设计一个小游戏“谁先走到17谁就赢”。规则如下:有两位参赛者,参赛者每次可以选择走1步、2步、3步;两位参赛者交替走,谁走的路程相加先等于17谁获胜;如果一方超过了17则判断谁输,另一方直接赢得比赛。要求在控制台交互,无论用户输入什么,程序都不能崩溃,并给出提示,引导用户输入正确的内容,例如输入走几步的时候,如果没有输入1、2、3中的任意数字,需要提示输入有误,请重新输入。案例实战10.5defgame():name1=input('请输入第一位游戏者的名字:')name2=input('请输入第二位游戏者的名字:')destination=17score=0allowed_step=[1,2,3]last_name='hello'print('每一次只能走1,2,3步中的一种')while1:try:first_go=int(input('%s,输入你要走几步:'%name1))first=allowed_step[first_go-1]score+=firstifscore>destination:print('你走超了,%s'%name1)breakprint('目前已经走到第%d步'%score)last_name=name1ifscore==destination:break案例实战10.5after_go=int(input('%s,输入你要走几步:'%name2))after=allowed_step[after_go-1]score+=afterifscore>destination:print('你走超了,%s'%name2)breakprint('目前已经走到第%d步'%score)last_name=name2ifscore==destination:breakexcept:print('只能输入1,2,3三种数字哦')print('你赢了,%s'%last_name)game()案例实战10.5请输入第一位游戏者的名字:a请输入第二位游戏者的名字:b每一次只能走1,2,3步中的一种a,输入你要走几步:5只能输入1,2,3三种数字哦a,输入你要走几步:3目前已经走到第3步b,输入你要走几步:1目前已经走到第4步a,输入你要走几步:2目前已经走到第6步b,输入你要走几步:2目前已经走到第8步a,输入你要走几步:4只能输入1,2,3三种数字哦a,输入你要走几步:3目前已经走到第11步b,输入你要走几步:1目前已经走到第12步运行结果如下:案例实战10.5a,输入你要走几步:3目前已经走到第15步b,输入你要走几步:3你走超了,b你赢了,a运行结果如下:课后习题10.61.Python程序的错误通常可以分为3中类型,即语法错误、运行时错误和
。2.Python异常的捕获使用try...except...结构,把可能发生异常的语句放在
子句里,用
子句来处理异常.3.如果try子句中的代码抛出了异常,并且被某个except捕获,则执行相应的异常处理代码,这种情况下
执行else中的代码。4.如果try中的代码没有抛出任何异常,则
else子句中的代码块。5.()类是所有的异常类的父类。A.BaseExceptionB.NameError
C.ExceptionD.
SyntaxError6.当程序出现异常,Python会自动抛出异常,也可以通过()语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人工智能在贷款评估中的应用
- 2026年国家公务员考试公共基础知识法律基础知识考试题库及答案
- 2026年广东省韶关市乐昌市梅田街道坪西社区工作人员考试模拟试题及答案
- 2026年安徽省淮南市潘集区潘集镇吴乡村社区工作人员考试模拟试题及答案
- 2026年(综合知识测试)湖北省从村(社区)干部中定向考录乡镇(街道)公务员综合练习题及答案
- 回复函关于外企2026年环保标准升级要求的意见(4篇范文)
- 能源行业项目工程师节能减排与创新成果绩效衡量表
- 设备租赁到期续签商洽函5篇
- 幼儿园城乡教育均衡发展违规处理办法
- 采购助理采购成本节约绩效评定表
- STEM教学设计心得体会(三篇)
- BS EN ISO 15848-1-2015 工业阀-逸散性排放的测量、试验和鉴定程序(中文)
- 首饰失蜡铸造工艺流程
- 新人教版七年级上册英语预备篇测试题附答案
- SB/T 11091-2014冷库节能运行技术规范
- GB/T 5185-2005焊接及相关工艺方法代号
- GB/T 34910.2-2017海洋可再生能源资源调查与评估指南第2部分:潮汐能
- 信用风险缓释工具课件
- 颅脑手术的麻醉课件
- 写字楼验收移交工作方案
- 废水处理工考试题库
评论
0/150
提交评论