版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- pcr技术课件简短
- 教案对数函数及其性质
- 玉溪师范学院《通信原理》2022-2023学年第一学期期末试卷
- 玉溪师范学院《数学课件设计与制作》2021-2022学年第一学期期末试卷
- 五下语文第1课教学课件教学课件教学
- 儿童画课件教学
- 2024年苯甲醇项目成效分析报告
- 《说说委屈的事》心理健康教学设计
- 仓库主管协议书
- 采购谈判记录 合同条款范本
- 2024二十届三中全会知识竞赛题库及答案
- (完整word版)小学开展仪式教育的策略研究.
- 送货单EXCEL模板
- 步兵班战术教案(全)
- 推荐塞上风情笛子简谱
- 布鲁纳《教育过程》
- 样品承认书标准版
- 田间生产管理记录档案
- 智慧城市建设论文5篇
- 人教版八年级地理(上册)期中试卷及答案(完整)
- 重症动脉瘤性蛛网膜下腔出血管理专家共识
评论
0/150
提交评论