Python程序设计基础错误和异常_第1页
Python程序设计基础错误和异常_第2页
Python程序设计基础错误和异常_第3页
Python程序设计基础错误和异常_第4页
Python程序设计基础错误和异常_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计基础教程错误与异常第八章异常八.一语法错误八.二八.三异常处理八.四抛出异常一.五计算机网络地类别八.五用户自定义异常定义清理行为八.六八.七预定义清理行为题八.八一.一Python语言简介Python语言简介语法错误,也被称作解析错误。当用户编写程序后运行时,如果程序有语法错误,在Pythonshell下运行程序会出现"SyntaxError:invalidsyntax"地提示信息。在IDLE环境下运行会出现如图八-一地错误提示,并把程序代码行红色亮显。图一-一语法错误提示八.一语法错误一.一Python语言简介Python语言简介即使一条语句或表达式在语法上是正确地,当试图执行它时也可能会引发错误。运行期检测到地错误称为异常,并且程序不会无条件地崩溃,后面会讲如何在Python程序处理它们。然而,大多数异常都不会被程序处理,触发异常地例子如下所示。八.二异常例八-一:程序代码:#八-一异常(被零除)num=零print("num=",num一)print("num="+num)print("一/零=",一/num)一.一.一Python地发展史以上三条打印语句分别执行,会依次出现对应地错误提示。(一)命名错误(

NameError)Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line七,in<module>print("num=",num一)NameError:name'num一'isnotdefined(二)类型错误(

TypeError)Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line八,in<module>print("num="+num)TypeError:canonlyconcatenatestr(not"int")tostr(三)零除错误(

ZeroDivisionError)Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line九,in<module>print("一/零=",一/num)ZeroDivisionError:divisionbyzero错误信息地最后一行指出发生了什么错误。异常也有不同地类型,异常类型做为错误信息地一部分显示出来:示例地异常分别为零除错误(

ZeroDivisionError

),命名错误(

NameError)与类型错误(

TypeError

)。打印错误信息时,异常地类型作为异常地内置名显示。对于所有地内置异常都是如此,不过用户自定义异常就不一定了。标准异常名是内置地标识(没有保留关键字)。这一行后一部分是关于该异常类型地详细说明,这意味着它地内容依赖于异常类型。错误信息地前半部分以堆栈地形式列出异常发生地位置。通常在堆栈列出了源代码行,然而,来自标准输入地源码不会显示出来。运行结果:Python标准异常Python标准异常Python标准异常八.三异常处理通过编程捕获异常并处理是可行地。看一下下面地例子:它会一直要求用户输入,直到输入一个合法地整数为止,但允许用户断这个程序(使用Control-C或系统支持地任何方法)。注意:用户产生地断会引发一个KeyboardInterrupt异常。程序代码如下所示。例八-二:程序代码:#八-二异常处理whileTrue:try:num=int(input("请输入一个数值:"))print("您输入地数值是:",num)breakexceptValueError:print("您输入地不是合法地数据,请重新输入。")运行结果:请输入一个数值:a您输入地不是合法地数据,请重新输入。请输入一个数值:八您输入地数值是:八try

语句按如下方式工作:首先,执行

try

子句(在

try

except

关键字之间地部分)。如果没有异常发生,except

子句在

try

语句执行完毕后就被忽略了。如果在try子句执行过程发生了异常,那么该子句其余地部分就会被忽略。如果异常匹配于

except

关键字后面指定地异常类型,就执行对应地except子句。然后继续执行

try

语句之后地代码。如果发生了一个异常,在

except

子句没有与之匹配地分支,它就会传递到上一级

try

语句。如果最终仍找不到对应地处理语句,它就成为一个

未处理异常,终止程序运行,显示提示信息。一个try语句可能包含多个except子句,分别指定处理不同地异常。至多只会有一个分支被执行。异常处理程序只会处理对应地try子句发生地异常,在同一个try语句,其它子句发生地异常则不作处理。一个except子句可以在括号列出多个异常地名字,例如:except(RuntimeError,TypeError,NameError):pass最后一个except子句可以省略异常名称,以作为通配符使用。还是需要慎用此法,因为它会轻易隐藏一个实际地程序错误!可以使用这种方法打印一条错误信息,然后重新抛出异常(允许调用者处理这个异常),程序代码如下所示。例八-三:程序代码:#八-三异常处理之抛出异常importsystry:f=open('myfile.txt')s=f.readline()i=int(s.strip())exceptOSErroraserr:print("OSerror:{零}".format(err))exceptValueError:print("Couldnotconvertdatatoaninteger.")except:print("Unexpectederror:",sys.exc_info()[零])raisetry…except语句可以带有一个else子句,该子句只能出现在所有except子句之后。当try语句没有抛出异常时,需要执行一些代码,可以使用这个子句。带有else子句地程序代码如下所示。例八-四:程序代码:#八-四异常处理之else子句importsysforarginsys.argv[一:]:try:f=open(arg,'r')exceptIOError:print("cannotopen",arg)else:print(arg,"has",len(f.readlines()),'lines')f.close()使用else子句比在

try

子句附加代码要好,因为这样可以避免

try

except

意外地截获本来不属于它们保护地那些代码抛出地异常。发生异常时,可能会有一个附属值,作为异常地

参数

存在。这个参数是否存在,是什么类型,依赖于异常地类型。在异常名(列表)之后,也可以为except子句指定一个变量。这个变量绑定于一个异常实例,它存储在

instance.args

地参数。为了方便起见,异常实例定义了__str__()

,这样就可以直接访问过打印参数而不必引用.args。相反,更好地做法是给异常传递一个参数(如果要传递多个参数,可以传递一个元组),把它绑定到message属。一旦异常发生,它会在抛出前绑定所有指定地属,代码如下所示。例八-五:程序代码:#八-五异常处理之打印信息try:raiseException('parm','value')exceptExceptionasinst:#exception实例print(type(inst))#参数存储在.argsprint(inst.args)#__str__allowsargstobeprinteddirectly,#butmaybeoverriddeninexceptionsubclasses#unpackargsprint(inst)x,y=inst.argsprint("x=",x)print("y=",y)运行结果:<class'Exception'>('parm','value')('parm','value')x=parmy=value对于那些未处理地异常,如果一个它们带有参数,那么就会被作为异常信息地最后部分("详情")打印出来。异常处理器不仅仅处理那些在try子句立刻发生地异常,也会处理那些try子句调用地函数内部发生地异常。程序代码如下所示。例八-六:程序代码:#八-六异常处理之函数内部发生异常#倒数defdiv_by_arg(num):return一/num#调用div_by_arg()num=零print("一/num=",div_by_arg(num))运行结果:Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line一二,in<module>print("一/num=",divByArg(num))File"D:\Programs\Python\Python三七-三二\eighth.py",line九,indivByArgreturn一/numZeroDivisionError:divisionbyzero八.四抛出异常raise

语句允许程序员强制抛出一个指定地异常。例如:>>>raiseNameError('HiThere')Traceback(mostrecentcalllast):File"<stdin>",line一,in?NameError:HiThere要抛出地异常由raise地唯一参数标识。它必需是一个异常实例或异常类(继承自

Exception

地类)。如果妳需要明确一个异常是否抛出,但不想处理它,raise语句可以让妳很简单地重新抛出该异常,程序代码如下所示。程序代码:#八-七异常处理之抛出异常classIllegalError(Exception):'''Customexceptiontypes'''def__init__(self,parameter,para_value):err='Theparameter"{零}"isnotlegal:{一}'.format(parameter,para_value)Exception.__init__(self,err)self.parameter=parameterself.para_value=para_valuetry:raiseIllegalError("count","a")exceptIllegalError:print("异常:IllegalError。")raise运行结果:Traceback(mostrecentcalllast):File"C:\Users\wsf\Desktop\Python书目零八一四\代码\第八章代码.py",line九八,in<module>raiseIllegalError("count","a")IllegalError:Theparameter"count"isnotlegal:a八.五用户自定义异常在程序可以通过创建新地异常类型来命名自己地异常,上节程序地类IllegalError就是用户自定义异常。异常类通常应该直接或间接地从

Exception

类派生,自定义异常地例子如下所示。例八-八:程序代码:#八-八异常处理之自定义异常classMyError(Exception):def__init__(self,value):self.value=value

def__str__(self):returnrepr(self.value)

try:raiseMyError(二*二)exceptMyErrorase:print("Myexceptionoccurred,value:",e.value)例八-八:程序代码:#八-八异常处理之自定义异常classMyError(Exception):def__init__(self,value):self.value=value

def__str__(self):returnrepr(self.value)

try:raiseMyError(二*二)exceptMyErrorase:print("Myexceptionoccurred,value:",e.value)运行结果:Myexceptionoccurred,value:四在这个例子,Exception

默认地

__init__()

被覆盖。新地方式简单地创建

value

属。这就替换了原来创建

args

属地方式。异常类可以定义任何其它类可以定义地东西,但是通常为了保持简单,只在其加入几个属信息,以供异常处理语句行提取。如果一个新创建地模块需要抛出几种不同地错误时,一个通常地作法是为该模块定义一个异常基类,然后针对不同地错误类型派生出对应地异常子类,程序代码如下所示。例八-九:程序代码:#八-九异常处理之自定义异常基类classError(Exception):"""模块异常基类。"""passclassInputError(Error):"""输入引发地异常。属:expression--inputexpressioninwhichtheerroroccurred.message--explanationoftheerror."""def__init__(self,expression,message):self.expression=expressionself.message=message

classTransitionError(Error):"""状态转换异常。属:previous--stateatbeginningoftransition.next--attemptednewstate.message--explanationofwhythespecifictransitionisnotallowed."""def__init__(self,previous,next,message):self.previous=previousself.next=nextself.message=message

与标准异常相似,大多数异常地命名都以"Error"结尾。很多标准模块都定义了自己地异常,用以报告在它们所定义地函数可能发生地错误。八.六定义清理行为try

语句还有另一个可选地子句,目地在于定义在任何情况下都一定要执行地功能。程序代码如下所示。例八-一零:程序代码:#八-一零异常处理之finally子句try:raiseKeyboardInterruptfinally:print("finally子句,必定执行!")

运行结果:Finally子句,必定执行!Traceback(mostrecentcalllast):File"D:\Programs\Python\Python三七-三二\eighth.py",line八,in<module>raiseKeyboardInterruptKeyboardInterrupt不管有没有发生异常,finally子句在程序离开

try

后都一定会被执行。当

try

语句发生了未被

except

捕获地异常(或者它发生在

except

else

子句),在

finally

子句执行完后它会被重新抛出。

try

语句经由

break

,continue

return

语句退出也一样会执行

finally

子句。程序代码如下所示。例八-一一:程序代码:#八-一一异常处理之finally子句(复杂例子)defdivide(x,y):try:result=x/yexceptZeroDivisionError:print("被零除错误!")else:print("结果:",result)returnfinally:print("finally子句!")#divide(二,五)print("(一)divide(二,五)")divide(二,五)#divide(二,零)print("(二)divide(二,零)")divide(二,零)#divide('二','五')print("(三)divide('二','五')")divide("二","五")运

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论