Python异常处理.pptx
- 文档编号:11546898
- 上传时间:2023-06-01
- 格式:PPTX
- 页数:38
- 大小:2.93MB
Python异常处理.pptx
《Python异常处理.pptx》由会员分享,可在线阅读,更多相关《Python异常处理.pptx(38页珍藏版)》请在冰点文库上搜索。
如果你是小周,请问:
(1)异常处理有哪些异常处理形式?
(2)如何将常见的异常处理形式运用到程序设计中去?
案例导入:
小周是大数据专业的学生,他正在进行一个系统的程序设计。
为了让用户更满意他的系统,老师建议他采用异常处理来增加系统的健壮性,减少用户误操作得不到正确处理导致程序崩溃并终止的情况。
那如何来将异常处理机制应用到程序设计中,小周就需要通过本章的学习来掌握。
第10章Python异常处理,再好的程序员也无法完全预见代码运行时遇到的所有情况;程序员经过反复检查会发现问题的根源是用户操作不堆满或输入了错误类型的数据导致的;最充分的测试也很难枚举所有可能出现的情况,这时候异常处理则是避免特殊情况下软件崩溃的利器。
包括Python语言在内的所有高级编程语言都提供了不同形式的异常处理机制,并且很强大。
第10章Python异常处理,在Python中,异常是指程序运行时引发的错误,引发错误的原因有很多,如:
除零、下标越界、文件不存在等。
这些错误得不到正确的处理将会导致程序崩溃并终止运行。
例如,运行下面的程序代码会发生错误。
10.1异常简介,10.1.1什么是异常,print(2/0)报错:
Traceback(mostrecentcalllast):
FileC:
/Python学习/异常1.py,line2,inprint(2/0)ZeroDivisionError:
divisionbyzero,从输出结果,错误提示可知,是除数不能为0。
如示例代码1:
10.1异常简介,10.1.1什么是异常,从输出结果,错误提示可知,是列表元下标超出范围。
通过前面章节的学习,大家应该已经注意到,如果类似于上面这些错误得不到正确的处理将会导致程序崩溃并终止运行,这就需要引入下面的异常处理机制来解决了。
list=1,2,3,4,5print(list5)报错:
Traceback(mostrecentcalllast):
FileC:
/Python学习/异常2.py,line2,inprint(list5)IndexError:
listindexoutofrange,示例代码2:
10.1.2异常类(Exception),在Python中,所有的异常类都是Exception的子类。
所有异常都是基类Exception的成员,它们都定义在exceptions模块中,不必导入就可以直接使用。
如果这个异常对象没有进行处理和捕捉,程序就会用所谓的回溯(traceback,一种错误信息)终止执行,这些信息包括错误的名称(例如NameError)、原因和错误发生的行号。
Python内置的异常类见表10-1
(1)所示。
10.1.2异常类(Exception),在Python中,所有的异常类都是Exception的子类。
所有异常都是基类Exception的成员,它们都定义在exceptions模块中,不必导入就可以直接使用。
如果这个异常对象没有进行处理和捕捉,程序就会用所谓的回溯(traceback,一种错误信息)终止执行,这些信息包括错误的名称(例如NameError)、原因和错误发生的行号。
Python内置的异常类见表10-1
(2)所示。
简单地说,异常处理是因为程序执行过程中出错而在正常控制流之外采取的行为。
严格来说,语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常,例如,由于大小写拼写错误而试图访问不存在的对象,或者试图访问不存在的文件,等等。
当Python监测到一个错误时,解释器就会指出当前程序已无法继续执行下去,这时候就出现了异常。
当程序执行过程中出现错误时Python会自动引发异常,程序员也可以通过raise语句显式地引发异常。
合理地使用异常处理结构可以使得程序更加健壮,具有更高的容错性。
10.1.3异常处理,什么是异常处理?
简单地说,可以理解为“请求原谅比请求允许要容易”。
也就是说,有些代码执行可能会出现错误,也可能不会出现错误,这主要由运行时的各种客观因素决定,此时建议使用异常处理结构。
如果使用大量的选择结构来提前判断,仅当满足相应条件时才执行该代码,这些条件可能会严重干扰正常的业务逻辑,也会降低代码的可读性。
10.1.3异常处理,值得引起大家注意的是以下几点:
尽管异常处理机制非常重要也非常有效,但是不建议使用异常来代替常规的检查,例如必要的if.else判断等。
在编程时应避免过多依赖于异常处理机制来提高程序的健壮性。
异常和错误这两个概念并不完全一样。
错误一般又可以分为语法错误和逻辑错误两种。
拼写错误、缩进不一致、引号或括号不闭合等都属于语法错误,一般来说存在语法错误的代码是无法运行的,这类错误很容易发现和解决;而存在逻辑错误的代码通常可以运行,只是非常可能会得到一个错误的结果,这类错误非常难发现。
为啥要使用异常处理结构呢?
10.2异常处理形式,Python提供了多种不同形式的异常处理,处理异常的能力非常强大,它们的基本思路都是一致的。
先尝试运行代码,最后处理可能发生的错误。
在实际使用时,可以根据需要来选择使用。
10.2.1try.except简单异常,Python异常处理结构中最基本的结构是try.except.结构。
该结构语法如下:
try:
#可能会引发异常的代码except:
#异常处理代码,为了让大家更好地理解,接下来通过一个案例来演示如何使用try.except语句。
下面的代码试图以只读的模式访问一个不存在的文件,示例代码如下。
例10-1简单异常.py,根据输出结果可知,当程序以只读的模式打开note.txt时,由于该文件没有,则捕获到了文件不存在的异常,并作出处理,输出信息打开的文件必须存在!
。
try:
f=open(note.txt,r)content=f.readlines()forlineincontent:
print(line)exceptFileNotFoundError:
print(打开的文件必须存在!
)输出结果打开的文件必须存在!
带有else子句的异常结构可以看作是一种特殊的选择结构,如果try中的代码抛出了异常并且被某个except语句捕获则执行相应的异常处理代码,这种情况下就不会执行else中的代码;如果try中的代码没有抛出异常,则执行else块的代码。
该结构的语法如下:
为了让大家更好地理解,接下来通过一个案例来演示如何使用try.except.else语句,如例10-2所示。
例10-2else异常处理.py,在例10-2中,监控到try语句中有错误时,会执行except里面的print语句,输出异常的描述信息;没有错误时,会执行else里面的print语句。
try:
#可能会引发异常的代码exceptExceptionasreason:
#用来处理异常的代码else:
#如果try子句中的代码没有引发异常,就继续执行这里的代码,try:
age=int(input(请输入你的年龄:
)print(你的年龄是:
%d。
%age)exceptExceptionasresult:
print(捕获到异常:
%s%result)else:
print(程序正常运行,没有异常!
),在这种结构中,无论try中的代码是否发生异常,也不管抛出的异常有没有被except语句捕获,finally子句中的代码总是会得到执行。
因此,finally中的代码常用来做一些清理工作以释放try子句中申请的资源。
该结构语法为:
10.2.3终止行为(finally),为了让大家更好地理解,接下来通过一个案例来演示如何使用finally语句,如例10-3所示。
例10-3finally异常处理.py,try:
#可能会引发异常的代码exceptExceptionasreason:
#用来处理异常的代码finally:
#无论try子句中的代码是否引发异常,都会执行这里的代码,importostry:
f=open(日记.py,w+,encoding=utf-8)f.write(人生苦短,需要学习Python!
)f.seek(0,0)content=f.read()print(content)exceptExceptionascuo:
print(错误的描述是:
cuo)finally:
print(到这里来了没有!
)f.close()输出结果:
人生苦短,需要学习Python!
到这里来了没有!
10.2.4捕获多个异常,在实际开发中,同一段代码可能会抛出多种异常,并且需要针对不同的异常类型进行相应的处理。
为了支持多种异常的捕捉和处理,Python提供了带有多个except的异常处理结构,一旦某个except捕捉到了异常,则其他的except子句将不会再尝试捕捉异常。
该结构类似于多分支选择结构,语法格式为:
try:
#可能会引发异常的代码exceptException1:
#处理异常类型1的代码exceptException2:
#处理异常类型2的代码exceptException3:
#处理异常类型3的代码.,为了让大家更好地理解,接下来通过一个案例来演示如何捕获多个异常,如例10-4所示。
例10-4多个异常.py,程序运行,分别输入了一个数10和一个字符c,结果如下所示:
如果一个except子句想要捕获多个异常,并且使用同一种处理方式。
在Python3中使用元组表示,代码如下所示。
try:
num1=int(input(请输入第一个数:
)num2=int(input(请输入第二个数:
)result=num1/num2print(%d/%d=%d%(num1,num2,result)exceptZeroDivisionError:
print(除数不能为零!
)exceptValueError:
print(只能输入数字!
),请输入第一个数:
10请输入第二个数:
c只能输入数字!
except(ZeroDivisionError,ValueError):
10.2.5异常处理的完整语句,Python异常处理结构中可以同时包含多个except子句、else子句和finally子句,称之为异常处理的完整语句。
它的语法格式为:
整个异常处理完整语句的执行思路如下:
正常执行的程序在可能会引发异常的代码(try语句块)中执行,在执行的过程中如果发生了异常,是需要中断当前在try语句块中的执行,然后跳转到对应的异常处理块中开始执行。
Python会从第一个exept处开始查找,如果找到了对应的异常类型,则进入其提供的except块中进行处理;如果没有找到,则直接进入不带异常类型的except块处进行处理;不带异常类型的except块是可选项,如果没有提供,这个异常就会被提交给Python进行默认处理,处理方式则是终止应用程序并打印提示信息。
如果在try语句块执行过程中没有发生任何异常,则程序在执行完try语句块后会进入else执行块中(如果存在的话)执行。
无论是否发生了异常,只要提供了finally语句,程序执行的最后一步总会执行它对应的代码块。
try:
#可能会引发异常的代码exceptA:
#处理异常A的代码else:
#处理没有异常的代码finally:
#最后必须处理的代码,为了让大家更好地理解,接下来通过一个案例来演示Python中异常处理的完整语句,如例10-5所示。
程序运行,div函数分别代入不同参数时的执行情况如右图:
例10-5异常处理的完整语句.py,在Python异常处理的完整语句中,值得大家注意的有以下几点:
完整语句中,try/exceptA/except/else/finally出现的顺序必须按照格式中的先后来,即所有的except必须在else和finally之前,else必须在finally之前,exceptA必须在except之前,否则会出现语法错误。
else与finally是可选的,不一定必须出现;else语句如果存在,必须以exceptA或excpt语句为前提,否则会引发语法错误。
defdiv(x,y):
try:
print(x/y)exceptZeroDivisionError:
print(ZeroDivisionError)exceptTypeError:
print(TypeError)else:
print(NoError)finally:
print(exceutingfinallyclause),执行
(1):
div(4,0)输出结果:
ZeroDivisionErrorexceutingfinallyclause执行
(2)div(a,0)输出结果:
TypeErrorexceutingfinallyclause执行(3)div(4,2)输出结果:
2.0NoErrorexceutingfinallyclause,10.3抛出异常,抛出异常是指:
Python用异常对象(exceptionobject)表示异常情况,遇到错误后,会引发异常。
如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行。
要想在Python程序中主动抛出异常,可以使用raise和assert语句。
10.4.1raise语句,使用raise语句能显示地触发异常,基本格式如下:
raiseException,args语句中Exception是异常的类型(例如,NameError),args是一个异常参数值。
该参数是可选的,如果不提供,异常的参数是None。
raise语句在Python程序中的应用需要根据实际情况来实施。
如何运用呢?
接下来,让我们一起通过一些示例来对raise语句的使用进行详细的介绍吧。
(1)使用类名引发异常当raise语句指定异常的类名时,会创建该类的实例对象,然后引发异常。
语法格式为:
raise异常类#引发异常时会隐式地创建类对象示例如:
raiseTypeError程序运行的结果如下:
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line1,inraiseTypeErrorTypeError,
(2)使用异常类对象引发异常通过显示地创建异常类的实例,直接使用该实例对象来引发异常。
这种方式是我们最常见的。
语法格式为:
raise异常类对象#引发异常类实例对象对应的异常先创建TypeError类的实例type,然后使用raise让type实例引发异常。
示例如:
raisetypetype=TypeError程序运行的结果如下:
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line2,inraisetypeTypeError,如果一个raise语句,没有带上任何参数时,就可以再次引发刚则发生过的异常。
语法格式为:
raise#重新引发刚刚发生的异常这种方式的作用是向外传递异常。
示例如:
try:
raiseTypeError:
print(你的输入有错!
)raise示例中,try里使用raise抛出了TypeError异常,程序会跳转到except子句中执行,输出“你的输入有错!
”,然后使用raise再次引发刚刚发生的异常,导致程序出现错误而终止运行。
程序运行的结果如下:
你的输入有错!
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line2,inraiseTypeErrorTypeError,(3)重新引发刚刚发生的异常,指定异常的描述信息在使用raise语句抛出异常时,有是要求给出一些描述的信息,示例如:
raiseTypeError(类型不匹配)由于示例在抛出异常类时传入了自定义的描述信息“类型不匹配”。
程序的运行结果如下:
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line1,inraiseTypeError(类型不匹配)TypeError:
类型不匹配,(4).指定异常的描述信息,(5).异常引发异常如果碰到要在异常中抛出另外一个异常,需要如何实现呢?
我们先来看一段示例及它的运行结果。
示例代码如:
raise#重新引发刚刚发生的异常try:
list=1,2,3,4print(list5)exceptExceptionasmessage:
raiseIndexError(下标超出指定范围)frommessage,程序的运行结果如下:
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line3,inprint(list5):
listindexoutofrangeTheaboveexceptionwasthedirectcauseofthefollowingexception:
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line5,inraiseIndexError(下标超出指定范围)frommessageIndexError:
不标超出指定范围,示例中,try里面先定义了列表list并存放了四个元素,其下标分别是(03),接下来访问list中下标为4的元素,由于没有该下标元素会引发IndexError异常,使得程序跳转到except子句中执行。
Except子句能捕捉所有的异常,并且使用raise-from语句抛出IndexError异常后再抛出“下标超出指定范围”的异常。
10.4.2assert语句,assert语句又称做断言,也是一种比较常用的技术,常用在程序的某个位置确认指定条件必须满足,常和异常处理结构一起使用。
断言语句assert仅当脚本的_debug_属性值为True时有效,一般只在开发和测试阶段使用。
当把Python程序编译成字节码文件时,assert语句将被删除。
当用户定义的约束条件不满足的时候,它会触发AssertionError异常,所以assert语句可以当作条件式的assert语句。
从上面的示例可知,assert语句是用来收集用户定义的约束条件,当age为5时,没有满足条件入学年龄必须为6岁及以上时,也就是条件为假就会引发异常。
assert语句的语法格式为:
assert逻辑表述式,data,10.4.2assert语句,格式中,逻辑表达式相当于条件。
data是可选的,通常为一个字符串。
当表达式的结果为False时,作为异常类型的描述信息使用。
示例如下:
age=5assertage=6,没有达到入学年龄!
程序的运行结果如下:
Traceback(mostrecentcalllast):
FileC:
/Python学习/第9章异常/异常.py,line2,inassertage=6,没有达到入学年龄!
AssertionError:
没有达到入学年龄,assert语句的语法格式为:
assert逻辑表述式,data,为了更好地让大家理解,接下来通过一个案例来演示assert语句的使用,如例10-6所示。
10.4.2assert语句,为了更好地让大家理解,接下来通过一个案例来演示assert语句的使用,如例10-6所示。
10.4.2assert语句,10.4自定义异常,前面捕捉到异常基本都是系统内置的,在程序中遇到某些错误时触发。
那如果程序员需要根据自己的需要设置异常,例如,用户在输入考试成绩时,需要限定成绩分值的有效范围。
这时就需要程序员自定义异常来解决。
图10-1异常继承树,因此,在python的异常分为两种:
(1)内建异常,就是python自己定义的异常。
(2)不够用,用户自定义异常。
从图10-1异常继承树中的分布情况可知,Exception类是所有异类的基类,创建一个继承Exception类的子类,它就是自定义的异常类。
当遇到程序员设定的错误时,就可以使用raise语句抛出自定义的异常。
如何抛出自定义异常,如例10-7所示。
例10-7自定义异常.py,在案例中,首先是定义了继承自Exception的类InputException,它会作为一个异常类使用。
若用记户输入的成绩不符合有效范围时,则会抛出InputException异常。
在InputException类中,score表示实际输入的考试成绩。
在try语句块中作了容错处理,如果用户输入的成绩小于0或者大于100,则使用raise语句抛出InputException异常。
10.5with语句,之前我们学习的finally语句是用于释放资源,如关闭文件等。
在Python中,另外还提供了with语法用于简化资源操作的后续清除操作,是try/finally的替代方法。
而它的实现原理是建立在上下文管理器之上的,所以我们就先给大家介绍一下上下文管理器。
10.5.1上下文管理器,要想使用with语句,前提就是要有上下文管理器。
什么是上下文管理器?
它是Python的一种语法,用于规定某个对象的使用范图,一旦进入或者离开使用范围,会有特殊的操作被调用。
下面是一组与上下文管理器和with语句有关的概念。
1.上下文管理协议(ContextManagementProtocol):
包含方法_enter_()和_exit_(),支持该协议的对象要实现这两个方法。
_enter_(self):
进入上下文管理器时调用此方法,其返回值被放入with-as语句中as说明符指定的变量中。
_exit_(self,type,value,tb):
离开上下文管理器调用此方法。
如果有异常出现,type、value、tb分别为异常的类型、值和追踪信息;如果没有异常,3个参数均设为None。
此方法返回值为True或者False,分别指示被引发的异常得到了还是没有得到处理,如果返回False,引发的异常会被传递出上下文。
2.上下文管理器(ContextManager):
支持上下文管理协议的对象,这种对象实现了_enter_()和_exit_()方法。
上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。
通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。
3运行时上下文(runtimecontext):
由上下文管理器创建,通过上下文管理器的_enter_()和_exit_()方法实现,_enter_()方法在语句体执行之前进入运行时上下文,_exit_()在语句体执行完后从运行时上下文退出。
with语句支持运行时上下文这一概念。
4上下文表达式(ContextExpression):
with语句中跟在关键字with之后的表达式,该表达式要返回一个上下文管理器对象。
5语句体(with-body):
with语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的_enter_()方法,执行完语句体之后会执行_exit_()方法。
10.5.2with语句,with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
with语句时在Python2.6中出现的新语句。
在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用try/finally代码结构。
如要实现文件在操作出现异常时也能正确关闭,则需要像如下实现:
f=open(test.txt)try:
forlineinf.readlines():
print(line)finally:
f.close(),with语句的基本语法结构如下:
withexpressionasvariable:
with-block,上述语法格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 异常 处理
![提示](https://static.bingdoc.com/images/bang_tan.gif)