版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章异常处理授课计划内置异常类型异常(exception)是指程序运行时引发的错误,引发错误的原因很多,如除零、类型错误、下标越界、字典键错误、文件不存在、磁盘空间不足、网络异常等这些错误如没有得到适当处理,将会导致程序运行终止而合理地使用异常处理能够让程序在发生异常后尽可能地运行下去,并为用户提供更加友好的错误提示信息Python内置了60余个提前定义好的异常类型用户可以使用它们处理普通应用程序可能发生的大多数异常还可以使用面向对象技术从Python内置的Exception类继承定义自己的异常类型什么是异常Python事先将可能发生的错误分门别类地加以整理,将其称为异常当特定的异常发生时,用户程序可以捕捉异常并进行处理,也可以选择忽视异常异常类型如果用户程序对发生的异常不做处理,Python默认的处理方式是像上面的例子那样终止程序执行并显示异常信息如果用户提供处理异常的代码,Python会在捕捉到异常后转而执行用户的异常处理代码,并在执行完毕后继续运行原程序发生异常之后的部分异常类型实际上,Python定义的异常不只包括程序运行时发生的错误,一些事件的发生也以异常的形式向外报告例如,到达可迭代对象末尾会触发StopIteration异常,用户中断执行(如在交互环境中输入Ctrl+C)会产生KeyboardInterrupt异常等异常类型Python内置异常类的继承层次Python事先将可能发生的错误分门别类地加以整理,将其称为异常当特定的异常发生时,用户程序可以捕捉异常并进行处理,也可以选择忽视异常BaseException是一切异常类的基类,它有四个子类:Exception、GeneratorExit、KeyboardInterrupt和SystemExit其中的GeneratorExit、KeyboardInterrupt和SystemExit是与系统退出相关的异常,与一般的应用程序关系不大Exception类包含各式各样的异常子类,用户编写的应用程序最常处理的就是这些类Python内置异常类的继承层次异常处理使用try…except语句捕捉并处理异常,将可能产生异常的代码加上缩进置于关键字try之下,待捕捉的异常类的名字置于关键字except之后,再加上缩进后的用于处理异常的代码,如下所示:相比Python默认提供的异常处理机制(终止程序执行,显示异常信息),使用try…except语句捕获异常并加以处理,程序在发生异常后还能继续运行下去,能够提高程序的健壮性try…except语句try:
<statements>
#Runthismainactionfirstexcept
<name1>:
<statements>
#Runifname1israisedduringtryblockexcept
(<name2>,
<name3>):
<statements>
#Runifanyofname2orname3occurexcept
<name4>
as
<instance>:
<statements>
#Runifname4israised,andgetinstanceraisedexcept:
<statements>
#Runforall(other)exceptionsraise示例:运行以上代码,结果如下:try代码块中的语句1/0在运行过程中产生的ZeroDivisionError异常被“exceptZeroDivisionError:”捕获,紧接着执行了except代码块中的用于处理异常的语句异常处理结束后,Python跳出try…except结构,继续执行之后的语句。位于try代码块内1/0语句之后的“print('Thislinewillnotbeexecuted')”不会被执行try…except语句try:
1
/
0
print('Thislinewillnotbeexecuted')except
ZeroDivisionError:
print('Catchanexception')print('Thislinewillbeexecutedasnormal')
CatchanexceptionThislinewillbeexecutedasnormal在except子句中,可以在异常名称后面指定一个变量名该变量名和一个异常实例绑定,实例的参数存储在args属性中为了方便起见,异常类定义了自己的__str__()方法,因此可以直接显示参数而无须引用args示例如下:try…except语句>>>
try:...
1
/
0...
except
ZeroDivisionError
aserr:...
print(type(err))...
print(err.args)...
print(err)...<class
'ZeroDivisionError'>('divisionbyzero',)divisionbyzero一个try语句可以附带多个except子句,发生的异常与各个except子句中的异常类名进行匹配,在第一次匹配成功后转而执行相应except代码块中的内容一个except子句也可以将多个异常类名组织成元组。只要匹配成功一次,就不会再尝试匹配之后的except子句示例如下:try…except语句>>>
try:...
1
/
0...
except
NameError
aserr:...
print('Caughtanerror:{0}'.format(err))...
except
(TypeError,
RuntimeError,
ZeroDivisionError)
aserr:...
print('Caughtanerror:{0}'.format(err))...
except
ZeroDivisionError:...
print('Thislinewillnotbeexecuted')...Caughtanerror:divisionbyzero用在except子句中的异常基类可以匹配它的子类例如,下面的代码通过继承Python内置的Exception类自定义了一个异常类B,然后依次定义了B的两个子类C和D使用关键字raise后跟异常类实例对象的方式强制地产生异常,except子句捕获异常后输出异常的类型上例会依次输出B、B、B。这是由于异常基类B被放在了第一个except子句中,从而“拦截”了所有的异常子类。交换语句exceptB和exceptD的位置,从而将异常基类B置于最后,就会输出B、C、Dtry…except语句class
B(Exception):
passclass
C(B):
passclass
D(C):
passforclsin
(B,C,D):
try:
raisecls
raisecls()
exceptB:
print('B')
exceptC:
print('C')
exceptD:
print('D')注意:可以将except子句中的异常类名省去,这样的空except子句将匹配一切异常但在实践中应谨慎使用这种方法,因为其容易掩盖真正的错误此外,空except语句还会“拦截”系统退出事件类(Python内置异常类继承关系中的GeneratorExit、KeyboardInterrupt和SystemExit),这几个异常事件一般不应由用户编写的应用程序处理因此,如果要一个作为“通配符”的except语句,应该使用exceptException,它可以匹配除了GeneratorExit、KeyboardInterrupt和SystemExit之外的一切异常。try…except语句ry…except语句可以附带一个else子句,其必须放在所有的except子句之后当执行完try代码块中的内容而没有产生任何异常时才会执行else子句中的内容下例在顺利打开文件之后才执行else子句中的内容,输出文件的行数try…except…else语句try:f=
open('filename.txt',
'r')except
OSError:
print('Cannotopenfile')else:
print('Filehas',
len(f.readlines()),
'lines')f.close()try语句还有另一个可选的finally子句如果在try代码块之后跟随着finally子句,那么Python一定会执行finally子句内的代码,而无论try代码块执行时是否发生了异常根据异常是否发生以及finally之前是否有except子句,可以分为以下三种情况(1)如果try代码块在运行过程中没有异常发生,Python会在执行完try代码块后继续执行finally中的内容。示例如下:try…except…finally语句>>>
try:...
print('Weareallright')...
finally:...
print('Thislinewillalwaysbeexecuted')...WeareallrightThislinewillalwaysbeexecuted(2)如果try代码块在运行过程中有异常发生,并且该异常被try之后的except子句捕获,则Python会在执行完except代码块后再执行finally中的内容。示例如下:try…except…finally语句>>>
try:...
raise
RuntimeError...
except
RuntimeError:...
print('Caughtanexception')...
finally:...
print('Thislinewillalwaysbeexecuted')...CaughtanexceptionThislinewillalwaysbeexecuted(3)如果try代码块在运行过程中有异常发生,但该异常没有被之后的except子句捕获,则Python会先执行finally中的内容,接着把异常向上传递。在下面这个使用Python交互环境的例子中,“向上传递”意味着触发Python默认的异常处理机制,即显示异常信息并终止程序运行。try…except…finally语句>>>
try:...
raise
NameError...
except
RuntimeError:...
print('Caughtanexception')...
finally:...
print('Thislinewillalwaysbeexecuted')...ThislinewillalwaysbeexecutedTraceback(mostrecentcalllast):File"<stdin>",line2,
in
<module>NameError此外,如果在执行try代码块的过程中遇到break、continue或return语句,则finally子句将在执行break、continue或return语句之前被执行。示例如下:如果finally子句中包含一个return语句,则返回值将来自finally子句的return语句的返回值,而非来自try子句的return语句的返回值。示例如下:try…except…finally语句>>>
while
True:...
try:...
break...
print('Nochancetoexecutethisline')...
finally:...
print('Thislinewillalwaysbeexecuted')...Thislinewillalwaysbeexecuted如果finally子句中包含一个return语句,则返回值将来自finally子句的return语句的返回值,而非来自try子句的return语句的返回值。示例如下:try…except…finally语句>>>
def
bool_return():...
try:...
return
True...
finally:...
return
False...>>>bool_return()False至此,将Python中与try…except相关的语法总结如下:try…except…else…finally语句try:
<statements>
#Runthismainactionfirstexcept
<name1>:
<statements>
#Runifname1israisedduringtryblockexcept
(<name2>,
<name3>):
<statements>
#Runifanyofname2orname3occurexcept
<name4>
as
<instance>:
<statements>
#Runifname4israised,andgettheinstanceraisedexcept:
<statements>
#Runforall(other)exceptionsraisedelse:
<statements>
#Runifnoexceptionisraisedduringtryblockfinally:
<statements>
#Willalwaysrun使用过raise语句能够显示地触发异常。以下两种方式效果相同,都会引发指定的异常类的一个实例,只是第一种形式通过调用没有参数的构造函数来隐式地创建实例:在创建异常类的实例对象时,可以为其提供参数,该参数一般是一个用于描述异常的字符串,此时必须使用括号。示例如下:raise语句>>>
raise
IndexError('theindexshouldstartfrom0')Traceback(mostrecentcalllast):File"<stdin>",line1,
in
<module>IndexError:theindexshouldstartfrom
0>>>
raise
IndexErrorTraceback(mostrecentcalllast):File"<stdin>",line1,
in
<module>IndexError>>>
raise
IndexError()Traceback(mostrecentcalllast):File"<stdin>",line1,
in
<module>IndexError仅使用关键字raise而不在其后附加异常名,就是重新引发当前的异常如果在捕获一个异常之后还希望该异常能继续传递下去,可以使用单独的raise语句raise语句importsystry:f=
open('filename.txt')s=f.readline()i=
int(s.strip())except
OSError
aserr:
print('OSerror:{0}'.format(err))except
ValueError:
print('Cannotconvertdatatoaninteger')except
Exception:
print("Unexpectederror:",sys.exc_info()[0])
raiseexcept
Exception:
print('Unexpectederror:',sys.exc_info()[0])
raise用户自定义异常除了使用Python提供的内置异常类外,用户还可以通过继承定义自己的异常类用户自定义的异常类不应继承Python一切内置异常的基类BaseException,而应继承Exception类可以选择直接继承Exception类,也可以继承Exception类的子类这样一来,在一条try…except语句的except子句中指明Exception,就可以捕获除了系统退出事件之外的所有异常。自定义异常用户自定义的异常类虽然可以执行任何操作,但一般都刻意保持简单,只提供一些属性用于记录与异常相关的信息在为一个应用程序定义专用的异常类时,通常的做法是先创建基类,再由该基类派生出不同的错误条件下的异常子类自定义异常class
CustomError(Exception):
"""Baseclassforotheruser-definedexceptions"""
passclass
ValueTooSmallError(CustomError):
"""Raisedwhentheinputvalueistoosmall"""
passclass
ValueTooLargeError(CustomError):
"""Raisedwhentheinputvalueistoolarge"""
pass可以在except子句中通过基类名捕获所有的用户自定义异常类,这正是使用继承组织用户自定义异常的好处自定义异常>>>
importsys>>>>>>
forclsin
(CustomError,ValueTooSmallError,ValueTooLargeError):...
try:...
raisecls()...
exceptCustomError:...
print(sys.exc_info())...(<class
'__main__.CustomError'>,CustomError(),
<tracebackobjectat0x0000022FCFB83E40>)(<class
'__main__.ValueTooSmallError'>,ValueTooSmallError(),
<tracebackobjectat0x0000022FCFB83E40>)(<class
'__main__.ValueTooLargeError'>,ValueTooLargeError(),
<tracebackobjectat0x0000022FCFB83E40>)断言断言(assert)用于在程序中插入简单的逻辑判断,以供调试之用。其语法如下:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手术室护理风险防范措施试题及答案
- 2026年315消费者权益保护法知识竞赛试题库(附含答案)
- 《药品经营质量管理规范》培训试题及答案
- 麻纺产品研发流程准则
- 麻纺厂人员培训管理准则
- 心理健康教育:认识自我教案
- 听力障碍儿童语言言语康复
- 第三单元测试卷 (3)2026-2027学年统编版七年级上册历史
- 元宇宙国内加盟合同
- 出版定制化技术服务合同
- 2026年消防设施操作员(初级)考试练习题库附答案详解
- 2026海南热带海洋学院招聘员额制辅导员8人参考题库及完整答案详解【考点梳理】
- 浙江省宁波市2025-2026学年高二下学期6月期末考试政治试题(含答案)
- 夏季食品安全风险与防控
- 2026年国开电大《医药商品营销实务》试题(附答案)
- 公司电器维修外包合同
- 汛期安全专项施工方案(3篇)
- 2026年高考数学终极冲刺:培优专题04 解析几何 6大重难题型(大题专练)(原卷版及全解全析)
- 2025年中国航材总部岗位公开招聘笔试历年参考题库附带答案详解
- 2025年国家基层糖尿病防治管理指南解读课件
- 青少年宫工作制度
评论
0/150
提交评论