版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章
异常处理结构与程序调试1异常(exception)简单地说,异常是指程序运行时引发的错误。引发错误的原因有很多,例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。如果这些错误得不到正确的处理将会导致程序终止运行,而合理地使用异常处理结果可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止。也可以使用异常处理结构为用户提供更加友好的提示。程序出现异常或错误之后是否能够调试程序并快速定位和解决存在的问题也是程序员综合水平和能力的重要体现方式之一。28.1什么是异常语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常,例如由于大小写拼写错误而访问不存在的对象。当Python检测到一个错误时,解释器就会指出当前流已无法继续执行下去,这时候就出现了异常。异常是指因为程序出错而在正常控制流以外采取的行为。异常分为两个阶段:第一个阶段是引起异常发生的错误;第二个阶段是检测并处理阶段。不建议使用异常来代替常规的检查,如if...else判断。应避免过多依赖于异常处理机制。当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常。38.2Python中的异常类下面列出了常用的异常类4抛出异常raise语句主动抛出异常定义自己的异常类时;或者需要抛出异常时。raise语法SomeException:必须是一个异常类,或异常类的实例;Args:传递给SomeException的参数,必须是一个元组;Traceback:很少用,主要是用来提供一个traceback对象。raise
[SomeException[,args[,traceback]]
5自定义异常类下面的例子演示了自定义的异常类必须继承Exception类:所有异常类的基类;class
MyError(Exception):
def
__init__(self,value):self.value=value
def
__str__(self):
returnrepr(self.value)>>>
try:
raiseMyError(2*2)exceptMyErrorase:
print('Myexceptionoccurred,value:',e.value)Myexceptionoccurred,value:
4>>>
raiseMyError('oops!')Traceback(mostrecentcalllast):File"<stdin>",line1,
in
?__main__.MyError:
'oops!'68.3Python中的异常处理结构常见的异常处理结构try.......except结构try.......except.......else结构带有多个except的try结构try.......except.......finally结构78.3.1try.......except结构这是最基本的处理结构;具有两种形式。代码处理形式一try:try_block#被监控的代码exceptException[,reason]:except_block#异常处理代码
代码处理形式二try:
...exceptBaseException,e:except_block优势:能够处理所有的异常建议尽量显式捕捉可能会出现的异常,并编写具有针对性的代码;最后一个except用来捕捉BaseException。8try.......except:示例1>>>
while
True:
try:x=int(input("Pleaseenteranumber:"))
break
exceptValueError:
print("Thatwasnovalidnumber.Tryagain...")Pleaseenteranumber:aThatwasnovalidnumber.Tryagain...Pleaseenteranumber:bThatwasnovalidnumber.Tryagain...Pleaseenteranumber:cThatwasnovalidnumber.Tryagain...Pleaseenteranumber:
109try.......except:示例2>>>
try:
raiseException('spam',
'eggs')exceptExceptionasinst:
print(type(inst))
#theexceptioninstance
print(inst.args)
#argumentsstoredin.args
print(inst)
#__str__allowsargstobeprinteddirectly,
#butmaybeoverriddeninexceptionsubclassesx,y=inst.args#unpackargs
print('x=',x)
print('y=',y)<class
'Exception'>('spam',
'eggs')('spam',
'eggs')x=spamy=eggs108.3.2try.......except.......else:示例1分析上述的代码输入错误:例如输入了非数值,或者输入的数值超出了正常的序号,会产生异常;执行红色print语句,并继续循环;其他的情况:输出列表中正确的字符串,并且退出循环。a_list=
['China',
'America',
'England',
'France']while
True:
print('请输入字符串的序号')n=int(input())
try:
print(a_list[n])
exceptIndexError:
print('列表元素的下标越界,请重新输入字符串的序号')
else:
break11try.......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()
128.3.3带有多个except的try结构功能:根据实际产生的例外,执行其中的例外程序块。try:try_block#被监控的语句exceptException1:except_block_1#处理异常1的语句exceptException2:except_block_2#处理异常2的语句...13带有多个except的try:示例1典型例子:除法。try:x=int(input('请输入被除数:'))y=int(input('请输入除数:'))z=float(x)
/yexceptZeroDivisionError:
print('除数不能为零')exceptTypeError:
print('被除数和除数应为数值类型')exceptNameError:
print('变量不存在')else:
print(x,
'/',y,
'=',z)14带有多个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):
pass
158.3.4try.......except.......finally结构特点Finally中的语句总会执行;可以用于清理工作,以便释放资源。典型结构如下try:try_block#被监控的代码except:except_block#例外处理程序块finally:finally_block#无论如何都会执行典型例子>>>
try:
3/0except:
print(3)finally:
print(5)3516try.......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(mostrecentcalllast):File"<pyshell#17>",line6,
in
<module>f.close()NameError:name'f'
is
notdefined完美代码?如果文件没有创建,则在finally中会产生异常。17try.......except.......finally:示例2例外产生之后,需要有相应的处理。如果没有相应的except处理块,代码的执行顺序会发生改变,直到找到相应的except处理块或者程序退出为止。>>>divide(2,
1)resultis
2.0executingfinallyclause>>>divide(2,
0)divisionbyzero!executingfinallyclause>>>divide("2",
"1")executingfinallyclauseTraceback(mostrecentcalllast):File"<stdin>",line1,
in
<module>File"<stdin>",line3,
individeTypeError:unsupportedoperandtype(s)
for
/:
'str'
and
'str'
def
divide(x,y):
try:result=x/y
exceptZeroDivisionError:
print("divisionbyzero!")
else:
print("resultis",result)
finally:
print("executingfinallyclause")18try.......except.......finally:示例3finally代码中:返回值要慎重!def
demo_div(a,b):
try:
returna/b
except:
pass
finally:
return
-1
>>>demo_div(1,
0)-1>>>demo_div(1,
2)-1>>>demo_div(10,
2)
198.4断言与上下文处理断言与上下文处理两种特殊的异常处理形式;形式上比通常的异常处理简单;208.4.1断言断言语句的语法assertexpression[,reason]
当判断表达式expression为真时,什么都不做;如果表达式为假,则抛出异常。assert语句用途一般用于开发程序时对特定必须满足的条件进行验证,仅当__debug__为True时有效。当Python脚本以-O选项编译为字节码文件时,assert语句将被移除以提高运行速度。21断言:示例1try:
assert
1
==
2
,
"1isnotequal2!"exceptAssertionErrorasreason:
print("%s:%s"%(reason.__class__.__name__,reason))AssertionError:1isnotequal2!22断言:示例2例程中assert作用:调用函数使用的参数符合要求;不符合要求时:提示用户存在的问题。def
RecursiveSum(n):
#precondition:n>=0
assert(n>=
0)
ifn==
0:
return
0
returnRecursiveSum(n-
1)
+n
#postcondition:returnedsumof1tondef
SumToN(n):
ifn<=
0:
raiseValueError("Nmustbegreaterthanorequalto0")
else:
returnRecursiveSum(n)>>>SumToN(10)55>>>SumToN('a')Traceback(mostrecentcalllast):File"<stdin>",line1,
in
<module>File"<stdin>",line2,
inSumToNTypeError:unorderabletypes:str()
<=int()>>>SumToN(-1)Traceback(mostrecentcalllast):File"<stdin>",line1,
in
<module>File"<stdin>",line3,
inSumToNValueError:Nmustbegreaterthanorequalto0238.4.2上下文管理使用with语句进行上下文管理With语句的语法with语句的作用解决try…finally结构中的资源释放问题;提供了一种简单的方法。with语句的实现依赖于python语言的magicmethod,需要实现__enter__()和__exit__()两个方法:上下文管理协议;或者通过引用contextlib,并使用@contextlib.contextmanager方式实现。withcontext_expr[asobj]:with_blockobj=context_exprobj.__enter__()try:with_blockfinally:obj.__exit__()24with语句:示例1这是一个实用Timer类,可以用来记录运行时间;可以对照上一页的内容理解本类的内容。importtimeclass
Timer(object):
def
__init__(self):
pass
def
__enter__(self):self.start=time.time()
def
__exit__(self,exception_type,exception_val,trace):
print("elapsed:",time.time()
-self.start)withTimer():
[iforiinrange(10000)]elapsed:1.744504928588867225with语句:示例2代码和前面(1)中的代码功能相同;通过使用@contextlib.contextmanager实现。importcontextlibimporttime
@contextlib.contextmanagerdef
time_print(task_name):t=time.time()
try:
yield
finally:
print(task_name,
"took",time.time()
-t,
"seconds.")withtime_print("processes"):
[ifor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体检中心客户关系维护与市场分析考核试卷
- 一年级汉字记忆技巧
- 八年级下册北师大版数学教案编写
- 初一上册苏教版政治解析教程详解
- 初中生快速掌握苏教版语文名句的方法
- 动物王国里的数学北师大版教案
- 新版北师大三年级下册数学知识点详解与答案
- 苏教版初中语文教材深度解读与分析
- 人教版观潮教学设计启示
- 中国古代的科技发明与技术创新
- 2024-2030全球及中国军用战车行业市场发展分析及前景趋势与投资发展研究报告
- 大数据分析技术在临时用电中的智能管理
- 《Photoshop图像处理》课件-任务一:对photoshop应用行业的了解
- 广告美学:原理与案例 课件全套 祁聿民 第0-8章 绪论、美学的基本问题- 广告的当代美学趋势和误区
- 《光伏发电工程安全验收评价规程》(NB-T 32038-2017)
- 互联网+与数字经济
- 医疗卫生机构医学装备管理办法
- 技术优势与核心竞争力分析
- 小学六年级学生心理健康教育课件
- 2024年全球渔业的全面发展
- VI设计理论课教案1
评论
0/150
提交评论