Python8-异常处理结构与程序调试

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第8章异常处理结构与程序调试异常(exception)•简单地说,异常是指程序运行时引发的错误。引发错误的原因有很多,例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。•如果这些错误得不到正确的处理将会导致程序终止运行•合理地使用异常处理结果可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止。•也可以使用异常处理结构为用户提供更加友好的提示。•程序出现异常或错误之后是否能够调试程序并快速定位和解决存在的问题也是程序员综合水平和能力的重要体现方式之一。8.1什么是异常•语法错误和逻辑错误不属于异常(运行时错误),但有些语法错误往往会导致异常,例如由于大小写拼写错误而访问不存在的对象。•当Python检测到一个错误时,解释器就会指出当前流已无法继续执行下去,这时候就出现了异常。异常是指因为程序出错而在正常控制流以外采取的行为。•异常分为两个阶段:第一个阶段是引起异常发生的错误;第二个阶段是检测并处理阶段。•不建议使用异常来代替常规的检查,如if...else判断。•应避免过多依赖于异常处理机制。•当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常。8.2Python中的异常类•下面列出了常用的异常类抛出异常raise语句•主动抛出异常•定义自己的异常类时;•或者需要抛出异常时。•raise语法•expression:必须是一个异常类,或异常类的实例对象;如果为一个异常类,则相当于首先创建一个该类的实例,然后抛出该异常对象•fromexpression2:给出了将两个异常连接起来的方法,表示异常是由于另一个expression2引起的。raise[expression[fromexpression2]]raiseExceptionraiseException('foooccurred!')raiseException('foooccurred!')fromException('anothererroroccured!')自定义异常类•下面的例子演示了自定义的异常类•必须继承Exception类或者其子类:Exception为所有异常类的基类;classMyError(Exception):def__init__(self,value):self.value=valuedef__str__(self):returnrepr(self.value)try:raiseMyError(2*2)exceptMyErrorase:print('Myexceptionoccurred',e)raiseMyexceptionoccurred4Traceback(mostrecentcalllast):FileC:/Users/dlmao/PycharmProjects/pythonClass/exception_demo.py,line14,inmoduleraiseMyError(2*2)MyError:48.3Python中的异常处理结构•第一种方式没有except块•执行body代码•不管有没有异常执行finally块•第二种方式至少有except块,else和finally可选•expression应该为•异常类•或者异常类的元组,表示其中任一异常出现try:bodyfinally:finallyBodytry:bodyexcept[expression[asidentifier]]:#至少一次,在多次出现时不带表达式except应该是最后一个。按序匹配找到对应的exception为止exceptionBodyelse:#可选的,在没有异常出现在前面的异常都没有出现时执行elseBodyfinally:#可选的,不管异常有没有都要执行finallyBody8.3Python中的异常处理结构•常见的异常处理结构•try.......except结构•try.......except.......else结构•带有多个except的try结构•try.......except.......finally结构try:bodyfinally:finallyBodytry:bodyexcept[expression[asidentifier]]:#至少一次,在多次出现时不带表达式except应该是最后一个。按序匹配找到对应的exception为止exceptionBodyelse:#可选的,在没有异常出现在前面的异常都没有出现时执行elseBodyfinally:#可选的,不管异常有没有都要执行finallyBody8.3.1try.......except结构•这是最基本的处理结构;•具有两种形式。代码处理形式一try:try_block#被监控的代码exceptException1[,reason]:except_block#异常处理代码代码处理形式二try:...exceptBaseException,e:except_block优势:能够处理所有的异常•建议•尽量显式捕捉可能会出现的异常,并编写具有针对性的代码;•最后一个except用来捕捉BaseException。try.......except:示例1whileTrue:try:x=int(input(Pleaseenteranumber:))breakexceptValueError:print(Thatwasnovalidnumber.Tryagain...)Pleaseenteranumber:aThatwasnovalidnumber.Tryagain...Pleaseenteranumber:bThatwasnovalidnumber.Tryagain...Pleaseenteranumber:cThatwasnovalidnumber.Tryagain...Pleaseenteranumber:10try.......except:示例2try:raiseException('spam','eggs')exceptExceptionasinst:print(type(inst))#theexceptioninstanceprint(inst.args)#argumentsstoredin.argsprint(inst)#__str__allowsargstobeprinteddirectly,#butmaybeoverriddeninexceptionsubclassesx,y=inst.args#unpackargsprint('x=',x)print('y=',y)print(x)print(inst)expressionasinstanceinstance为异常对象注意:在exceptionblock并不是一个新的scope,但是instance在退出该block后不可用class'Exception'('spam','eggs')('spam','eggs')x=spamy=eggsspamtraceback(mostrecentcalllast):UnboundLocalError:localvariable'inst'referencedbeforeassignment8.3.2try.......except.......else:示例1•分析上述的代码•输入错误:例如输入的数值超出了正常的序号,会产生异常;执行红色print语句,并继续循环;•但是输入了非数值?•其他的情况:输出列表中正确的字符串,并且退出循环。a_list=['China','America','England','France']whileTrue:print('请输入字符串的序号')n=int(input())try:print(a_list[n])exceptIndexError:print('列表元素的下标越界,请重新输入字符串的序号')else:breakdefexcept_else_1():a_list=['China','America','England','France']whileTrue:print('请输入字符串的序号')try:n=int(input())print(a_list[n])exceptIndexError:print('列表元素的下标越界,请重新输入字符串的序号')exceptValueError:print('输入不是十进制整数,请重新输入字符串的序号')else:breaktry.......except.......else:示例2•分析•功能:读取并输出文件的内容。•在出现例外的情况下,执行红色的print语句后,结束程序的执行;•在没有例外的情况下,执行else块的内容。forarginsys.argv[1:]:try:f=open(arg,'r')exceptIOError:print('cannotopen',arg)else:print(arg,'has',len(f.readlines()),'lines')f.close()8.3.3带有多个except的try结构•功能:•根据实际产生的例外,执行其中的例外程序块。try:try_block#被监控的语句exceptException1:except_block_1#处理异常1的语句exceptException2:except_block_2#处理异常2的语句...带有多个except的try:示例1•典型例子:除法。try:x=int(input('请输入被除数:'))y=int(input('请输入除数:'))z=float(x)/yexceptZeroDivisionError:print('除数不能为零')exceptTypeError:print('被除数和除数应为数值类型')exceptNameError:print('变量不存在')else:print(x,'/',y,'=',z)带有多个except的try:示例2•当有多个except块而且处理相同时,可以使用元组的形式处理。importsystry:f=open('sample.txt')s=f.readline()i=int(s.strip())exceptOSErroraserr:print(OSerror:{0}.format(err))exceptValueError:print(Couldnotconvertdatatoaninteger.)except:print(Unexpectederror:,sys.exc_info()[0])raiseimportsystry:f=open('sample.txt')s=f.readline()i=int(s.strip())except(OSError,ValueError,RuntimeError,NameError):pass8.3.4try.......except.......finally结构•特点•Finally中的语句总会执行;•可以用于清理工作,以便释放资源。•典型结构如下try:try_block#被监控的代码except:except_block#例外处理程序块finally:finally_block#无论如何都会执行典型例子try:3/0except:print(3)finally:print(5)35try.......except.......finally:示例1•典型例程:文件的读取。try:f=open('sample.txt','r')line=f.readline()print(line)finally:f.close()try:f=open('sample2.txt','r')line=f.readline()print(line)finally:f.close()Traceback(mostre

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功