内容正文:
任务3.4 异常处理
求两个正整数的和
大家好,这一节我们讲解如何用python的异常处理来进行程序语句的控制,从而实现求两个正整数的和。
1
3.4 异常处理——求两个正整数的和
【任务描述】
程序运行时会出现各种异常,这就需要我们对错误进行预判并提前处理。例如,有这样一个程序,需要实现求两个正整数A和B的和,并要求在一行中输入A和B,中间以空格分开。但是在输入A和B时,却不一定是程序要求的正整数,可能是负数、浮点数,甚至一堆乱码。因此,为控制这种异常情况,在设计程序时,如果用户输入的是两个正整数,则按“A+B=和”的格式输出;如果输入的不是正整数,则在相应位置输出“?”,此时的和也是“?”
3.4 异常处理——求两个正整数的和
【任务分析】
上述问题可以用多分支结构实现,也可以用异常处理实现。程序要求A和B都是正整数,而Python中输入的都是字符串,则可以用int()函数将其转换为正整数,当输入非整数形式的内容时,系统会抛出异常。这里需要用异常处理来控制整个程序的流程。
3.4 异常处理——求两个正整数的和
3.4.1 程序中的错误
3.4.2 异常及处理
3.4.3 任务实现——求两个正整数的和
3.4.1 程序中的错误
大家好,这一节我们讲解如何用python的异常处理来进行程序语句的控制,从而实现求两个正整数的和。
5
3.4.1 程序中的错误
程序中的错误分为3类:语法错误、逻辑错误和运行时错误。
1.语法错误
语法错误(SyntaxError)也称解析错误,是指由不遵循语言的语法引起的错误,一般是指程序语句、表达式、函数等存在书写格式错误或语法规则上的错误。语法错误属于编译阶段的错误,会导致解析错误。有语法错误的程序无法正确地编译或运行。
常见的语法错误包括:程序遗漏了某些必要的符号(冒号、逗号或括号)、关键字拼写错误、缩进不正确、全角符号和空语句块(需要用pass语句)等。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
6
3.4.1 程序中的错误
语法错误一般会在IDLE或其他IDE中有明显的错误提示,如图所示。这段代码是在Pycharm中编写的,程序中存在三处语法错误。第一处在第一行语句中,这里的赋值符号为全角状态,应用半角符号;第二处在if语句结尾,缺失了半角的冒号;第三处是关键字print拼写错误。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
7
3.4.1 程序中的错误
2.逻辑错误
逻辑错误(语义错误)是指程序可以正常运行,但其执行结果与预期不符。与语法错误不同,存在逻辑错误的程序从语法上来说是正确的,但会产生意外的输出结果,并不一定会被立即发现。逻辑错误的唯一表现是错误的运行结果。
常见的逻辑错误包括:运算符优先级考虑不周、变量名使用不正确、语句块缩进层次错误、在布尔表达式中出错等。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
8
3.4.1 程序中的错误
例如下面的代码段,当输入的用户名为“admin”或“root”,且密码为“asd*-+”时,输出“登录成功”。
if username=="admin" or username == 'root' and password=='asd*-+':
print("登录成功")
这段程序没有语法错误,但由于or的优先级低于and,因此一旦or左边的结果为真,右边就会被短路,若不做处理,则直接输出“登录成功”。这里可以分成两个if语句来写或用括号改变优先级,确保逻辑的正确性。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
9
3.4.1 程序中的错误
3.运行时错误
运行时错误是指程序可以运行,但是在运行过程中遇到错误,导致意外退出。当程序由于运行时错误而停止时,通常会说程序崩溃了。通常所说的异常便是运行时错误,有时也会把所有错误都归于异常。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
10
3.4.2 异常及处理
大家好,这一节我们讲解如何用python的异常处理来进行程序语句的控制,从而实现求两个正整数的和。
11
3.4.2 异常及处理
1.try...except子句
在Python中,可以使用try、except、else和finally这几个关键字来组成一个包容性很好的程序,通过捕捉和处理异常来增强程序的健壮性。用try可以检测语句块中的错误,从而让except语句捕获异常信息并进行处理。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
12
3.4.2 异常及处理
try:
<语句块1> # 需要检测异常的代码块
except <异常名称1>:
<语句块2> # 在try部分引发异常名称1时执行的语句块
[except <异常名称2>:
<语句块3>] # 在try部分引发异常名称2时执行的语句块
[else:
<语句块4>] # 在没有异常发生时执行的语句块
[finally:
<语句块5>]
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
13
3.4.2 异常及处理
except语句和finally语句都不是必需的,但是二者必须要有一个,否则try就没有意义。except语句可以有多个,Python会按except语句的顺序依次匹配指定的异常,如果异常已经得到处理则不会进入后面的except语句。
程序首先执行try与except句之间的语句块,如果未发生异常,则忽略所有except下面的语句块,直接执行else或后面的语句块。
如果在执行try子句的过程中发生异常,且异常与某个except后面的错误类型相符,则执行该except后面的语句块。except句可以有多个,分别用于处理不同类型的异常,但程序只能执行其中一个。
如果try中的语句无法正确执行,则根据错误类型选择执行对应except中的语句块,该语句块中可以包含错误信息或者其他的可执行语句。
如果try中的语句没有触发异常,即语句可以正常执行,则执行else中的语句块。
finally放在最后,其内容通常是做一些后续的处理,比如关闭文件、资源释放之类的操作。finally后面的语句块是无论如何都要执行的,即使在前面的try和except语句块中出现了return,也会将finally后面的语句块执行完再去执行前面的return语句。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
14
3.4.2 异常及处理
2.单异常处理
while True: # 构建无限循环,使用户在异常发生时可以重复输入
try: # 判断是否存在异常,在无异常时执行其子句
Temp=input()
if Temp[-1]== 'C':
Temp=1.8*float(Temp[0:-1])+32
print("华氏温度为:{:.2}F".format(Temp))
elif Temp[-1]=='F':
Temp=(float(Temp[0:-1])-32)/1.8
print("摄氏温度为:{:.2f}C".format(Temp))
else:
print("输入错误,末位只能是“C”或“F”")
except: # 在异常被触发时给出重新输入的提示,并准备接收输入
print("输入错误,除末位外应该是数值型,请重新输入")
else: # 在无异常触发时结束循环
break
单异常处理是指只针对一类异常进行捕捉的程序控制。
“float(Temp[0:-1])”在进行数据类型转换时可能会因为括号中的数据无法转换为浮点型而出现异常,而这个异常基本上是用户输入的问题。当用户输入的数据不符合题目要求时,程序要能抛出异常并进行合适的处理。我们可以在捕捉到输入异常时要求用户重新输入,在无异常触发时执行else子句来结束循环。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
15
3.4.2 异常及处理
3.多异常处理
python允许用户在一个程序中同时对多类异常进行捕捉,触发哪个异常就执行哪个异常对应的语句。Python中常见的异常名称及其描述如表3-1所示,读者可以参考Python文档查看所有的异常类及其子类。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
16
3.4.2 异常及处理
异常名称 描述
Exception 常规异常的基类,可以捕捉任意异常
SyntaxError 语法错误
NameError 未声明/未初始化的对象(没有属性)
SystemError 一般的解释器系统错误
ValueError 传入无效的参数,或传入一个用户不期望的值,即使值的类型是正确的
IndentationError 缩进错误(代码没有正确对齐)
ImportError 导入模块/对象失败(路径问题或名称错误)
ModuleNotFoundError 模块不存在
ZeroDivisionError 除(或取模)零
OverflowError 数值运算超出最大限制
AttributeError 对象没有这个属性
IndexError 索引超出序列边界,如x只有10个元素,却访问x[11]
KeyError 映射中没有这个键(试图访问字典里不存在的键)
TypeError 对类型无效的操作
TabError Tab和空格混用
RuntimeError 一般的运行时错误
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
17
3.4.2 异常及处理
【例3-19】多异常处理。
try:
import turtle #import tutle时输出“模块名称有误”
size=eval(input())
print (size) #参数写成sizee时会输出“变量未定义”
turtle.circle (size)
turtle.done () # done写成one时,会输出“属性不存在”
except ModuleNotFoundError :
print('‘模块名称有误’')
except NameError:
print("变量未定义")
except AttributeError:
print('‘属性不存在’')
except SyntaxError:
print('‘存在语法错误’')
在【例3-19】中,如果把模块turtle写成tutle,则会捕捉到错误ModuleNotFoundError异常,执行对应的print语句;如果把size写成sizee,则会捕捉到NameError异常,执行对应的print语句。
Python内置了一个Exception类,该类可以捕捉到所有内置的、非系统退出的异常,以及所有用户定义的异常。当需要输出程序遇到的异常时,可以使用以下方法。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
18
3.4.2 异常及处理
【例3-20】Exception类的使用。
try:
import tutle
size = eval (input() ) # import tutle时输出“NO module named ‘tutle’”
print(size) # 参数写成sizee时会输出“name‘sizee’is not define”
turtle.circle(size) # circle写成circe时输出“module'turtle has no attribute‘circe’”
turtle. done()
except Exception as e:
print(e)
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
19
即学即答:
对于except子句的排列,下列哪种是正确的( )
A.父类在前,子类在后
B.子类在前,父类在后
C.没有顺序,谁在前先捕获谁
D.先有子类,与其他如何排列无关
3.4.2 异常及处理
3.4.2 异常及处理
4.finally语句
如果try子句中的异常没有在exception中被指出,则系统会抛出traceback(默认错误代码),并且终止程序,接下来的所有代码都不会被执行。如果用finally关键字,则程序会在抛出traceback之前执行finally中的语句。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
21
3.4.2 异常及处理
s= ' ' '静夜思
李白
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
' ' '
try:
file= open('test.txt', 'w', encoding='utf-8') # 以“写”模式打开文件
file.write(s) # 写入s中的字符串
file.seek (0) # 文件指针回到文件开头
for line in file: # 遍历逐行读文件
print (line, end= '') #逐行输出文件内容
# 若将file.close()放在此处,则当前面遇到异常时无法关闭文件
【例3-21】finally语句的使用。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
22
3.4.2 异常及处理
except:
print('文件读写权限错误')
finally:
file.close () # finally中的语句无论是否触发异常都会被执行,可确保文件关闭
即学即答:
在异常处理中,释放资源、关闭文件、关闭数据库等由( )来完成。
A.try子句 B.catch子句
C.finally子句 D.raise子句
3.4.2 异常及处理
3.4.3 任务实现——求两个正整数的和
大家好,这一节我们讲解如何用python的异常处理来进行程序语句的控制,从而实现求两个正整数的和。
25
3.4.3 任务实现——求两个正整数的和
【任务分析】
求两个正整数A和B的和,在一行中输入A和B,中间以空格分开。因为Python中输入的都是字符串,所以要用int()函数将其转换为正整数,当输入非整数形式的内容时,程序会抛出异常。小T在设计程序代码时,先把输入的字符串根据空格划分为多个字符串并放入列表中,然后根据多种可能情况用try...except子句来实现捕捉异常。
3.4.2 异常及处理
ls=input().split()
try:
a=int(ls[0])
if a<=0:
a='?'
except:
a='?'
【例3-22】任务实现:求两个正整数的和。
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
27
3.4.2 异常及处理
try:
b=int(ls[1])
if b<=0:
b='?'
except:
b='?'
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
28
3.4.2 异常及处理
if a=='?' or b=='?':
print('{}+{} ={}'.format (a, b,'?'))
else:
print('{}+{} ={}'.format (a, b,a+b))
3+4 =7
我们首先来看一下判断语句里面的单分支结构也就if语句。单分支结构很简单,当满足条件时执行某个语句块。类似我们生活中的,如果,则....... 。如果信号灯转绿灯,则往前走。
需要注意的是:1.每个条件后面都要使用冒号(:),表示接下来是满足条件后要执行的语句块。
2.使用缩进来划分语句块,相同的缩进数的语句在一起组成一个语句块。
29
$$