版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ISBN:978-7-111-59261-7在Python中,异常会导致运行时错误。异常就是一个表示阻止执行正常进行的错误或情况。
Python提供异常处理与断言两个非常重要的功能来处理Python程序在运行中出现的异常与错误。这种异常处理机制为复杂程序提供了强有力的错误处理与运行保障。第8章异常处理学习重点和难点:异常的处理异常的处理断言程序调试第8章异常处理
如果异常没有处理,那么程序将会非正常终止。该如何规划处理这些异常,以使程序可以继续平稳运行而直到终止呢?这就是本章要学习的内容。8.1错误种类
8.2异常8.3断言8.4调试8.5应用实例第8章异常处理8.1错误种类8.1.1语法错误
8.1.2运行时错误8.1.3逻辑错误
Python有3种错误:语法错误、逻辑错误和运行时错误(异常)。8.1.1语法错误
Python的语法错误或者称之为解析错,是初学者经常碰到的,如下例:>>>whileTrueprint('Helloworld')
File"<stdin>",line1,in?
whileTrueprint('Helloworld')
^SyntaxError:invalidsyntax
这个例子中,函数print()被检查到有错误,是它前面缺少了一个冒号(:)。
语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。8.1.2运行时错误
即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现出来,例如:>>>10*(1/0)Traceback(mostrecentcalllast):File"<stdin>",line1,in?ZeroDivisionError:divisionbyzero8.1.3逻辑错误
逻辑错误可能会由于不完整或者不合法的输入导致,也可能是无法生成、计算等,或者是逻辑上错误或考虑不周而存在的问题。当Python检测到一个错误时,解释器就无法继续执行下去,就会抛出异常。
8.2异常8.2.1异常处理8.2.2抛出异常8.2.3自定义异常8.2.4定义清理异常8.2.1异常处理
捕捉异常可以使用try/except语句。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
以下为简单的try....except...else的语法:8.2.1异常处理try:<语句>#运行可能会引发异常的代码except<名字1>:<语句>#如果在try部分引发了<名字1>异常......except<名字n>as<数据>:<语句>#如果引发了<名字n>异常,获得附加的数据......else:<语句>#如果没有异常发生8.2.1异常处理
try的工作原理是,当开始一个try语句后,Python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。如果当try后的语句执行时发生异常,Python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
except后面也可以没有任何异常类型,即无异常参数。如果这样,不论try部分发生什么异常,都会执行except。8.2.1异常处理
如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
如果在try子句执行时没有发生异常,Python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。8.2.1异常处理
try-finally语句try-finally语句无论是否发生异常都将执行最后的代码。try:
<语句>finally:
<语句>#退出try时总会执行注意:你可以使用except语句或者finally语句,但是两者不能同时使用。else语句也不能与finally语句同时使用。
8.2.1异常处理
例如:try:
fh=open("testfile","w")
fh.write("Thisismytestfileforexceptionhandling!!")finally:fh.close()打开的文件输出后,自动关闭文件。同样的例子也可以写成如下方式:try:
fh=open("testfile","w")
try:fh.write("Thisismytestfileforexceptionhandling!!")
finally:print("Goingtoclosethefile.");fh.close()exceptIOError:print("Error:can\'tfindfileorreaddata.")当在try块中抛出一个异常,立即执行finally块代码。
8.2.1异常处理
try语句按照如下方式工作:1)首先,执行try子句(在关键字try和关键字except之间的语句)2)如果没有异常发生,忽略except子句,try子句执行后结束。3)如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try语句之后的代码。8.2.2抛出异常
抛出异常是指在程序运行发生错误的情况下,引发的处理异常的程序代码行为。这样,当用户程序运行发生错误时,用户程序也能继续执行发生错误处下面的代码,而不会因发生错误而跳出这个程序。
Python使用raise语句抛出一个指定的异常。raise语法格式如下:raise[Exception[,args[,traceback]]]#用于Python2.xraise[<expression1>[from<expression2>]]#用于Python3.x
8.2.2抛出异常
下面是raise语句的一使用举例:raiseNameError('HiThere')#或raise(NameError('HiThere'))Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>NameError:HiThere
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的raise语句就可以再次把它抛出。
8.2.3自定义异常
可以通过创建一个新的exception类来拥有自己的异常。异常应该是典型的继承自Exception类,或者直接继承,或者间接继承。定义一个异常非常简单,如下所示:def函数名(level):
iflevel<1:raise"Invalidlevel!",level
#Thecodebelowtothiswouldnotbeexecuted(ifweraisetheexception)
注意:为了能够捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串。8.2.4定义清理异常1、定义清理行为finally子句
try语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。例如:try:raiseKeyboardInterruptfinally:print('Goodbye,world!')运行结果:Goodbye,world!KeyboardInterrupt以上例子不管try子句里面有没有发生异常,finally子句都会执行。2、预定义的清理行为with语句
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
下面这个例子展示了尝试打开一个文件,然后把内容打印到屏幕上:forlineinopen("myfile.txt"):print(line,end="")
以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。
关键词with语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行它的清理方法:withopen("myfile.txt")asf:
forlineinf:print(line,end="")
以上这段代码执行完毕后,就算在处理过程中出问题了,文件f总是会关闭。
8.3断言
断言(Assert)是一句等价于布尔真的判定,发生异常就意味着表达式为假。
assert的应用情景就有点像汉语的意思一样,当程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就抛出错误。下面举例说明:classAccount(object):def__init__(self,number):
self.number=number;self.balance=0defdeposit(self,amount):
assertamount>08.3断言
self.balance+=amountdefwithdraw(self,amount):assertamount>0ifamount<=self.balance:self.balance-=amountelse:print("balanceisnotenough.")上面的程序中,deposit()和withdraw()方法的参数amount值必须是大于零的,这里就用断言,如果不满足条件就会报错。8.4调试
调试程序是编写高级语言程序必有的步骤与技能。Python提供了多种调试程序的方法与手段,下面分使用IDLE与pdb来介绍Python所具有的调试技能。8.4.1使用IDLE调试8.4.2使用pdb调试调试程序的方法
8.4.1使用IDLE调试1、进入调试模式
点击IDLE,进入pythonshell界面,如图8-1,这里点击Debug标签,点击Debugger,就可以进入调试模式了。8.4.1使用IDLE调试
这时候会弹出一个框,这就是待会儿要用到的调试窗口,如图8-2所示。8.4.1使用IDLE调试2.运行你要调试的代码文件8.4.1使用IDLE调试
这里已经打开了一个将要调试的文件(注意用File->Open打开,如图8-3所示),点击Run,点击Runmodule,这时候可以看到调试窗口显示出了数据(如果没有数据,则关闭重新打开,先打开IDLE,然后打开代码文件,再打开调试模式,最后运行代码)。
8.4.2使用pdb调试调试程序的方法
程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂。为此需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的。因此,需要一整套调试程序的手段来修复bug。8.4.2使用pdb调试调试程序的方法1、直接放置第一种方法简单直接,就是用print把可能有问题的变量打印出来分析:#err.pydeffoo(s):
n=int(s);print('>>>n=%d'%n)
return10/nfoo('0')执行后在输出中查找打印的变量值:pythonerr.py>>>n=0Traceback(mostrecentcalllast):...ZeroDivisionError:divisionbyzero用print最大的坏处是将来还得删掉它。8.4.2使用pdb调试调试程序的方法2、断言凡是用print来辅助查看的地方,都可以用断言来替代:deffoo(s):#err.py
n=int(s)
assertn!=0,'niszero!'
return10/nfoo('0')assert的意思是,表达式n!=0应该是True,否则,后面的代码就会出错。8.4.2使用pdb调试调试程序的方法3、logging
把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:importlogging#err.pys='0';n=int(s)('n=%d'%n)print(10/n)
()就可以输出一段文本。运行后发现除了ZeroDivisionError,没有任何信息。怎么回事?这样,在importlogging之后添加一行配置再试试:logging.basicConfig(level=logging.INFO,format='%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s%(message)s',datefmt='%a,%d%b%Y%H:%M:%S',filename='myapp.log',filemode='w')#logging.basicConfig()参数含义略8.4.2使用pdb调试调试程序的方法4、pdb
第4种方式是启动Python的调试器pdb(具体功调试能见表8-2),让程序以单步方式运行,可以随时查看运行状态。下面先准备好程序(err.py):s='0'n=int(s)print(10/n)
然后启动:$python-mpdberr.py>c:\python3632\err.py(1)<module>()->s='0'8.4.2使用pdb调试调试程序的方法
以参数-mpdb启动后,pdb定位到下一步要执行的代码->s='0'。输入命令l来查看代码:(Pdb)l1->s='0'2n=int(s)3print(10/n)[EOF]输入命令n可以单步执行代码:(Pdb)n>c:\python3632\err.py(2)<module>()->n=int(s)(Pdb)n8.4.2使用pdb调试调试程序的方法>c:\python3632\err.py(3)<module>()->print(10/n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年企业办公区域安全与消防知识培训
- 临沂人力资源管理2025年全真卷
- 极端天气下医疗系统恢复的模拟演练设计
- 血压测量与数据安全
- 26年NCCN评估更新解读
- 胃肠外科患者静脉输液护理
- 初中“不潦草”规范说课稿
- 26年基因检测中西医结合适配指南
- 美发护理假发使用指南
- 老年人跌倒预防与紧急处理
- 23J916-1 住宅排气道(一)
- 2023年韶关市新丰县中等职业技术学校招聘流动岗位教师考试真题
- DL∕T 2447-2021 水电站防水淹厂房安全检查技术规程
- DL∕T 802.3-2023 电力电缆导管技术条件 第3部分:实壁类塑料电缆导管
- 2024年6月四川高中学业水平合格考地理试卷真题(精校打印版)
- 《药理学》电子教案(人卫版) (中职教育)
- 统计学-相关与回归分析
- 七年级语文竞赛试卷
- 计算机毕业设计jsp智能化社区活动报名小区管理系统论文
- 肺腺癌术后护理查房
- 2025年日历日程表含农历可打印
评论
0/150
提交评论