版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python语言基础第11章
异常处理11.1异常处理的基本思路11.2Python异常处理机制
11.2.1try…except语句
11.2.2try…except…else语句
11.2.3带有多个except的try语句11.2.4try…except…finally语句11.3断言assert11.4主动引发异常与自定义异常类 11.4.1主动引发异常 11.4.2自定义异常类11.1异常处理的基本思路11.1异常的概念异常是一种运行时的错误,是由于程序的运行状态已经超出了程序员所掌控的范围,严重时程序会中途退出,终止执行。一些常见的错误。由于被零除而导致错误:>>>3.14/0Traceback(mostrecentcalllast):File"<pyshell#0>",line1,in<module>3.14/0ZeroDivisionError:floatdivisionbyzero由于对象在运算时类型不正确(如数值和字符串相加))而导致的错误:>>>5+'G'Traceback(mostrecentcalllast):File"<pyshell#2>",line1,in<module>5+'G'TypeError:unsupportedoperandtype(s)for+:'int'and'str'由于错误的索引(索引值超出范围)而导致的错误:>>>lst=[1,2,3,4,5]>>>lst[5]Traceback(mostrecentcalllast):File"<pyshell#4>",line1,in<module>lst[5]IndexError:listindexoutofrange访问未被赋值的变量(引用未定义的变量)导致的错误:>>>m='我爱Python'>>>print(n)Traceback(mostrecentcalllast):File"<pyshell#7>",line1,in<module>print(n)NameError:name'n'isnotdefined向一个对象发起不可用的功能请求(通常是一个方法)时导致的错误:>>>(5,3,8,6).sort()Traceback(mostrecentcalllast):File"<pyshell#8>",line1,in<module>(5,3,8,6).sort()AttributeError:'tuple'objecthasnoattribute'sort'由于请求的文件不存在或不在指定位置而导致的错误:>>>open('NotexistentFile.txt','r')Traceback(mostrecentcalllast):File"<pyshell#11>",line1,in<module>open('NotexistentFile.txt','r')FileNotFoundError:[Errno2]Nosuchfileordirectory:'NotexistentFile.txt'由于Python语句无法找到要请求的模块而导致错误:>>>importNotexistentModuleTraceback(mostrecentcalllast):File"<pyshell#12>",line1,in<module>importNotexistentModuleModuleNotFoundError:Nomodulenamed'NotexistentModule'程序在运行中出现错误时,系统会创建一个对象,该对象被称为异常。异常包含了所有与错误相关的信息。例如,它包含错误信息,指出发生了什么,属于什么类型,错误发生在程序的第几行等。异常跟踪标记Traceback(mostrecentcalllast):
File"<pyshell#12>",line1,in<module>importNotexistentModuleModuleNotFoundError:Nomodulenamed'NotexistentModule'
异常位置异常类型异常内容提示图11-1异常提示的信息结构程序在运行中出现的错误,主要分为两类:一是程序本身存在部分错误,由于程序的复杂性导致一些错误没有被发现。二是程序以外的非正常情况,如当用户输入数据出现错误,文件或其他数据源提供的数据出现错误,程序不能正确地处理这类错误数据。程序在运行中出现的错误,产生的异常,如果不做恰当的处理,多数情况下程序是无法执行下去的,进而中断执行并退出程序。总之,程序在运行中出现的错误,产生的异常必须要处理,不能轻视它,更不能视而不见。Python提供了一个异常处理的机制,使得程序在运行阶段发生错误时,程序员有机会处理并恢复。11.2Python异常处理机制Python语言异常处理机制是:将异常的检测与与异常处理相分离。实际上,这是将业务的功能代码与异常处理代码相分离,提高了程序的可理解性和可维护性,适合与编写规模较大的程序,能够有效地保证程序的质量。11.2.1try…except语句try:<try语句块>#被监测(检查)语句块,可能抛出异常的代码段except<类型>:#如果在try块引发“类型”异常,捕获该“类型”异常<except语句块>#处理该“类型”异常的代码段例11-1,约克城(Yorktown)号巡洋舰上的除0错误,通过下面的try…except语句的程序段来解决。defmain():a=eval(input("inputthefirstnumberr:"))whileTrue:try:b=eval(input("inputthesecondnumberr:"))c=a/bbreakexceptZeroDivisionError:print("thesecondnumberris0.Inputthesecondnumberragain.")print('{}/{}={}'.format(a,b,c))main()程序运行结果:inputthefirstnumberr:8inputthesecondnumberr:0thesecondnumberris0.Inputthesecondnumberragain.inputthesecondnumberr:0thesecondnumberris0.Inputthesecondnumberragain.inputthesecondnumberr:0thesecondnumberris0.Inputthesecondnumberragain.inputthesecondnumberr:48/4=2.0文件的输入输出一般要做异常处理。例11-2使用异常处理try…except语句来保证对一个文件testfile.txt进行写入操作时,不会使程序意外终止。#testfileWrite.pydefmain():try:withopen("testfile.txt","w")asfh:fh.write("这是一个测试文件,用于测试异常!")print("内容写入文件成功")exceptIOError:print("Error:没有找到文件或读取文件失败")print("程序运行结束了.")程序运行结果:Error:没有找到文件或读取文件失败11.2.2try…except…else语句语法格式是:try:<try语句块>#被监测(检查)的try语句块,可能抛出异常的代码段except<类型>:#如果在try块引发了“类型”异常,捕获该“类型”异常<except语句块>#处理该“类型”异常的代码段else:<else语句块>#如果没有异常发生,执行else语句块例11-6使用try…except…else语句改写例11-2的程序。#testfileWriteElse.pydefmain():try:withopen("testfile.txt","w")asfh:fh.write("这是一个测试文件,用于测试异常!!")exceptIOError:print("Error:没有找到文件或读取文件失败")else:print("内容写入文件成功")main()11.2.3带有多个except的try语句语法形式如下:try:<try语句块>except<类型1>:#引发了“类型1”异常,捕获该“类型1”异常<except语句块>#处理该“类型1”异常的代码段except<类型2>:#引发了“类型2”异常,捕获该“类型2”异常<except语句块>#处理该“类型2”异常的代码段......except<类型n>:#引发了“类型n”异常,捕获该“类型n”异常<except语句块>#处理该“类型n”异常的代码段一旦一个excep捕获了异常,则后面剩余的except子句将不会再执行。例11-8使用带有多个except的try语句,保证用户提供正确的列表的索引。#listIndexExcept.pydefmain():fruits=['苹果','梨','西瓜','香蕉','桃子']whileTrue:try:i=eval(input("inputfruitindex[0-4]:"))print(fruits[i])breakexceptIndexError:print("indexnotin[0-4],pleaseinputagain.")exceptTypeError:print("indexisfloat,pleaseinputagain.")exceptNameError:print("indexisnotanumber,pleaseinputagain.")main()程序运行结果:inputfruitindex[0-4]:8indexnotin[0-4],pleaseinputagain.inputfruitindex[0-4]:3.4indexisfloat,pleaseinputagain.inputfruitindex[0-4]:twqindexisnotanumber,pleaseinputagain.inputfruitindex[0-4]:2西瓜11.2.4try…except…finally语句语法格式是:try:<try语句块>#try语句块,可能抛出异常的代码段except<类型>:#try块引发了“类型”异常,捕获该“类型”异常<except语句块>#处理该“类型”异常的代码段else:<else语句块>#如果没有异常发生,才会执行else语句块finally:<finally语句块>#无论是否有异常,都会执行finally语句块例11-10下面的程序尝试计算一个文件中所有浮点数的总和、平均数、数字的个数和非数字的个数。程序使用异常处理机制来应对一些意外情况,例如文件不存在,文件为空,或文件中有非数字的值。#sumAndCountInFile.pydefmain():foundFlag=Truesum,count,errnum=0,0,0#求和,计数,统计不能转换成浮点数的个数try:filename=input("enterfilename:")f=open(filename,"r")exceptFileNotFoundError:print("Error:没有找到文件或读取文件失败.")foundFlag=Falseelse:print("文件成功打开,开始计算.")iffoundFlag:try:forlineinf:forninline.split():try:x=float(n)sum+=xcount+=1exceptValueError:errnum+=1average=sum/countexceptZeroDivisionError:print("Filewasempty.")else:print(average,sum,count,errnum)finally:f.close()#关闭文件,释放资源main()程序运行结果:例如打开一个空文件,结果如下:enterfilename:emptyFile.txt文件成功打开,开始计算.Filewasempty.11.3断言assert断言用来确定某个条件是否满足。其语法格式如下:assert表达式1,表达式2功能:当表达式1的值为真时,什么都不做,否则,抛出AssertionError异常。表达式2为异常类型的信息描述,可以省略。例如,>>>sex='女'>>>assertsex=='男','条件不满足导致异常'Traceback(mostrecentcalllast):File"<pyshell#3>",line1,in<module>assertsex=='男','条件不满足导致异常'AssertionError:条件不满足导致异常11.4主动引发异常与自定义异常类11.4.1主动引发异常基本形式有两种:raise异常类型raiseraise语句引发异常,与系统引发的异常一样。例11-12下面我们设计一个求三角形面积的函数,检查三条边参数是否能构成三角形,如果三条边不能构成三角形,就引发异常。#triangleFunction.pydeftriangle(a,b,c):ifa>0andb>0andc>0anda+b>canda+c>bandb+c>a:s=(a+b+c)/2return(s*(s-a)*(s-b)*(s-c))**0.5else:raiseValueError("wrongargumentsforfunctiontriangle")#主动引发异常defmain():whileTrue:try:a=float(input("a="))b=float(input("b="))c=float(input("c="))exceptValueError:#处理输入引发的异常print("Nofloatnumber.Pleasea,b,andcagain.")else:breaktry:area=triangle(a,b,c)exceptValueErrorasmsg:#调用函数处理被调用函数引发的异常print(msg)else:print("area=",area)main()程序运行结果:a=2b=4c=7wrongargumentsforfunctiontriangle11.4.2自定义异常类定义自己的异常类型,而不是依赖于通用的内置的异常类型,常常更加方便。一个用户自定义类,可以用于定制处理和报告错误,可以获得更多有用的错误信息。Python提供了许多内置异常类,它们之间的关系如图11-1所示。BaseException类是所有异常类的父类,所有的Python异常类都直接或间接地继承自BaseException类。最重要的异常类是Exception类。其它常用的内置的异常类都是类Exception的子类。BaseExceptionExceptionStandardExceptionRuntimeErrorArithmeticErrorEnvironmentErrorLookupErrorSyntaxErrorZeroDivisionErrorIndentationErrorIOErrorOSErrorIndexErrorkeyError图11-1主要内置异常类之间的继承关系图例11-15下面我们使用自定义非法成绩异常类,解决录入成绩时的非法成绩问题。通过这个例子介绍如何定义一个自定义异常类,如何在程序中抛出一个异常,实现用自定义异常完成异常处理任务。#OutOfBoundScore.pyclassOutOfBoundExcept(ValueError):#定义自己的异常类def__init__(self,score,reason):#构造方法super().__init__()self.score=scoreself.reason=reasondefmain():sum,num,ave=0,0,0foriinrange(5):try:score=eval(input("score="))ifnot(0<=score<=100):#检测非法成绩,抛出自定义异常raiseOutOfBoundExcept(score,"score<0orscore>100")sum+=int(score)num+=1ave=sum//numexceptOutOfBoundExceptasex1:print(ex1.score,"isin",ex1.reason)#处理自定义异常exceptNameErrorasex2:print(ex2)exceptSyntaxErrorasex3:print(ex3)except:print("invaildscore")else:print("vaildscore")print(ave,sum,num)main()程序运行结果:score=101101isinscore<0orscore>100#表明101在0到100分之间score=-90-90isinscore<0orscore>100#表明-90在0到100分之间score=twoname'two'isnotdefined#没有定义'two'变量score=070leadingzerosindecimalintegerliteralsarenotpermitted;usean0oprefixforoctalintegers(<string>,line1)#十进制整数不能以0开头score=5thunexpectedEOFwhileparsing(<string>,line1)000例11-16下面,我们通过自定义异常来处理猿类中半径为负数的问题。#CircleRadiusException.pyimportmathclassInvalidRadiusException(RuntimeError):#定义自己的异常类d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西医科大学《文学理论》2025-2026学年期末试卷
- 苏州大学《卫生事业管理》2025-2026学年期末试卷
- 山西师范大学《工商行政管理学概论》2025-2026学年期末试卷
- 上海立达学院《信息管理概论》2025-2026学年期末试卷
- 上海工程技术大学《工程管理概论》2025-2026学年期末试卷
- 上海浦东职业技术学院《中国近代政治思想史》2025-2026学年期末试卷
- 忻州职业技术学院《政治学导论》2025-2026学年期末试卷
- 沈阳师范大学《妇产科护理学实践与学习指导》2025-2026学年期末试卷
- 沈阳医学院《西方经济学》2025-2026学年期末试卷
- 山西农业大学《中药化学》2025-2026学年期末试卷
- 2026年广东电网春季校园招聘考试参考题库及答案解析
- 2026河南郑州体育产业集团有限公司招聘42人考试备考试题及答案解析
- 语文园地二 课件 2025-2026学年统编版语文三年级下册
- 2026年宁夏职业技术学院单招职业技能测试题库带答案详解(巩固)
- 2025年初级电焊工理论考试题及及答案
- 2026广东广州花都城投住宅建设有限公司第二次招聘项目用工人员4人笔试模拟试题及答案解析
- 象形字和形声字课件
- 2026年江苏省苏州市高职单招语文真题及参考答案
- 2026年高铁辅警考试题库附答案
- 2026年《必背60题》畜牧兽医专业26届考研复试高频面试题包含详细解答
- 中科大量子信息安全课件
评论
0/150
提交评论