Python异常处理.pptx
《Python异常处理.pptx》由会员分享,可在线阅读,更多相关《Python异常处理.pptx(38页珍藏版)》请在冰豆网上搜索。
如果你是小周,请问:
(1)异常处理有哪些异常处理形式?
(2)如何将常见的异常处理形式运用到程序设计中去?
案例导入:
小周是大数据专业的学生,他正在进行一个系统的程序设计。
为了让用户更满意他的系统,老师建议他采用异常处理来增加系统的健壮性,减少用户误操作得不到正确处理导致程序崩溃并终止的情况。
那如何来将异常处理机制应用到程序设计中,小周就需要通过本章的学习来掌握。
第10章Python异常处理,再好的程序员也无法完全预见代码运行时遇到的所有情况;程序员经过反复检查会发现问题的根源是用户操作不堆满或输入了错误类型的数据导致的;最充分的测试也很难枚举所有可能出现的情况,这时候异常处理则是避免特殊情况下软件崩溃的利器。
包括Python语言在内的所有高级编程语言都提供了不同形式的异常处理机制,并且很强大。
第10章Python异常处理,在Python中,异常是指程序运行时引发的错误,引发错误的原因有很多,如:
除零、下标越界、文件不存在等。
这些错误得不到正确的处理将会导致程序崩溃并终止运行。
例如,运行下面的程序代码会发生错误。
10.1异常简介,10.1.1什么是异常,rint(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语句为前提,否则会引发语法错误。
def