8+Python程序设计+异常处理结构与程序调试PPT演示.ppt
- 文档编号:11357809
- 上传时间:2023-05-31
- 格式:PPT
- 页数:30
- 大小:173.40KB
8+Python程序设计+异常处理结构与程序调试PPT演示.ppt
《8+Python程序设计+异常处理结构与程序调试PPT演示.ppt》由会员分享,可在线阅读,更多相关《8+Python程序设计+异常处理结构与程序调试PPT演示.ppt(30页珍藏版)》请在冰点文库上搜索。
第8章异常处理结构与程序调试,异常(exception),简单地说,异常是指程序运行时引发的错误。
引发错误的原因有很多,例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。
如果这些错误得不到正确的处理将会导致程序终止运行,而合理地使用异常处理结果可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止。
也可以使用异常处理结构为用户提供更加友好的提示。
程序出现异常或错误之后是否能够调试程序并快速定位和解决存在的问题也是程序员综合水平和能力的重要体现方式之一。
8.1什么是异常,语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常,例如由于大小写拼写错误而访问不存在的对象。
当Python检测到一个错误时,解释器就会指出当前流已无法继续执行下去,这时候就出现了异常。
异常是指因为程序出错而在正常控制流以外采取的行为。
异常分为两个阶段:
第一个阶段是引起异常发生的错误;第二个阶段是检测并处理阶段。
不建议使用异常来代替常规的检查,如if.else判断。
应避免过多依赖于异常处理机制。
当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常。
8.2Python中的异常类,下面列出了常用的异常类,抛出异常raise语句,主动抛出异常定义自己的异常类时;或者需要抛出异常时。
raise语法SomeException:
必须是一个异常类,或异常类的实例;Args:
传递给SomeException的参数,必须是一个元组;Traceback:
很少用,主要是用来提供一个traceback对象。
raiseSomeException,args,traceback,自定义异常类,下面的例子演示了自定义的异常类必须继承Exception类:
所有异常类的基类;,classMyError(Exception):
def_init_(self,value):
self.value=valuedef_str_(self):
returnrepr(self.value),try:
raiseMyError(2*2)exceptMyErrorase:
print(Myexceptionoccurred,value:
e.value)Myexceptionoccurred,value:
4raiseMyError(oops!
)Traceback(mostrecentcalllast):
File,line1,in?
_main_.MyError:
oops!
8.3Python中的异常处理结构,常见的异常处理结构try.except结构try.except.else结构带有多个except的try结构try.except.finally结构,8.3.1try.except结构,这是最基本的处理结构;具有两种形式。
代码处理形式一try:
try_block#被监控的代码exceptException,reason:
except_block#异常处理代码,代码处理形式二try:
.exceptBaseException,e:
except_block优势:
能够处理所有的异常,建议尽量显式捕捉可能会出现的异常,并编写具有针对性的代码;最后一个except用来捕捉BaseException。
try.except:
示例1,whileTrue:
try:
x=int(input(Pleaseenteranumber:
)breakexceptValueError:
print(Thatwasnovalidnumber.Tryagain.),Pleaseenteranumber:
aThatwasnovalidnumber.Tryagain.Pleaseenteranumber:
bThatwasnovalidnumber.Tryagain.Pleaseenteranumber:
cThatwasnovalidnumber.Tryagain.Pleaseenteranumber:
10,try.except:
示例2,try:
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)(spam,eggs)(spam,eggs)x=spamy=eggs,8.3.2try.except.else:
示例1,分析上述的代码输入错误:
例如输入了非数值,或者输入的数值超出了正常的序号,会产生异常;执行红色print语句,并继续循环;其他的情况:
输出列表中正确的字符串,并且退出循环。
a_list=China,America,England,FrancewhileTrue:
print(请输入字符串的序号)n=int(input()try:
print(a_listn)exceptIndexError:
print(列表元素的下标越界,请重新输入字符串的序号)else:
break,try.except.else:
示例2,分析功能:
读取并输出文件的内容。
在出现例外的情况下,执行红色的print语句后,结束程序的执行;在没有例外的情况下,执行else块的内容。
forarginsys.argv1:
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)raise,importsystry:
f=open(sample.txt)s=f.readline()i=int(s.strip()except(OSError,ValueError,RuntimeError,NameError):
pass,8.3.4try.except.finally结构,特点Finally中的语句总会执行;可以用于清理工作,以便释放资源。
典型结构如下,try:
try_block#被监控的代码except:
except_block#例外处理程序块finally:
finally_block#无论如何都会执行,典型例子try:
3/0except:
print(3)finally:
print(5)35,try.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,line6,inf.close()NameError:
namefisnotdefined,完美代码?
如果文件没有创建,则在finally中会产生异常。
try.except.finally:
示例2,例外产生之后,需要有相应的处理。
如果没有相应的except处理块,代码的执行顺序会发生改变,直到找到相应的except处理块或者程序退出为止。
divide(2,1)resultis2.0executingfinallyclausedivide(2,0)divisionbyzero!
executingfinallyclausedivide(2,1)executingfinallyclauseTraceback(mostrecentcalllast):
File,line1,inFile,line3,individeTypeError:
unsupportedoperandtype(s)for/:
strandstr,defdivide(x,y):
try:
result=x/yexceptZeroDivisionError:
print(divisionbyzero!
)else:
print(resultis,result)finally:
print(executingfinallyclause),try.except.finally:
示例3,finally代码中:
返回值要慎重!
defdemo_div(a,b):
try:
returna/bexcept:
passfinally:
return-1,demo_div(1,0)-1demo_div(1,2)-1demo_div(10,2),8.4断言与上下文处理,断言与上下文处理两种特殊的异常处理形式;形式上比通常的异常处理简单;,8.4.1断言,断言语句的语法assertexpression,reason当判断表达式expression为真时,什么都不做;如果表达式为假,则抛出异常。
assert语句用途一般用于开发程序时对特定必须满足的条件进行验证,仅当_debug_为True时有效。
当Python脚本以-O选项编译为字节码文件时,assert语句将被移除以提高运行速度。
断言:
示例1,try:
assert1=2,1isnotequal2!
exceptAssertionErrorasreason:
print(%s:
%s%(reason._class_._name_,reason),AssertionError:
1isnotequal2!
断言:
示例2,例程中assert作用:
调用函数使用的参数符合要求;不符合要求时:
提示用户存在的问题。
defRecursiveSum(n):
#precondition:
n=0assert(n=0)ifn=0:
return0returnRecursiveSum(n-1)+n#postcondition:
returnedsumof1tondefSumToN(n):
ifn=0:
raiseValueError(Nmustbegreaterthanorequalto0)else:
returnRecursiveSum(n),SumToN(10)55SumToN(a)Traceback(mostrecentcalllast):
File,line1,inFile,line2,inSumToNTypeError:
unorderabletypes:
str()SumToN(-1)Traceback(mostrecentcalllast):
File,line1,inFile,line3,inSumToNValueError:
Nmustbegreaterthanorequalto0,8.4.2上下文管理,使用with语句进行上下文管理With语句的语法with语句的作用解决tryfinally结构中的资源释放问题;提供了一种简单的方法。
with语句的实现依赖于python语言的magicmethod,需要实现_enter_()和_exit_()两个方法:
上下文管理协议;或者通过引用contextlib,并使用contextlib.contextmanager方式实现。
withcontext_exprasobj:
with_block,obj=context_exprobj._enter_()try:
with_blockfinally:
obj._exit_(),with语句:
示例1,这是一个实用Timer类,可以用来记录运行时间;可以对照上一页的内容理解本类的内容。
importtimeclassTimer(object):
def_init_(self):
passdef_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.7445049285888672,with语句:
示例2,代码和前面
(1)中的代码功能相同;通过使用contextlib.contextmanager实现。
importcontextlibimporttimecontextlib.contextmanagerdeftime_print(task_name):
t=time.time()try:
yieldfinally:
print(task_name,took,time.time()-t,seconds.)withtime_print(processes):
iforiinrange(10000),processestook1.650709867477417seconds.,with语句:
示例3,文件读写下面的代码把文件myfile.txt内容复制到myfile.txt-bk中;思考:
代码是否足够简洁?
withopen(sample.txt)asfr,open(sample.txt-bk,w)asfw:
forlineinfr:
fw.write(line),8.5用sys模块回溯最后的异常,发生异常时Python回溯异常,给出大量的提示;可用sys模块回溯最近一次的异常。
importsystry:
blockexcept:
errors=sys.exc_info()print(errors),sys.exc_info()可以直接定位,defA():
1/0defB():
A()defC():
B(),C()Traceback(mostrecentcalllast):
File,line1,inFile,line2,inCFile,line2,inBFile,line2,inAZeroDivisionError:
divisionbyzero,try:
C()except:
r=sys.exc_info()print(r)(,ZeroDivisionError(divisionbyzero,),),谢谢观看!
2020,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 程序设计 异常 处理 结构 程序 调试 PPT 演示