笔记
try语句
形式一:try-except
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
[]括起来的部分是可选参数,reason只是个变量名,用别的名称代替也可以。
1.当文件不存在时:
2.一个try语句可以与多个except搭配使用,例如:
或是用一个except也可以起到检测多种异常的效果:
try:
f = open('s.txt')
sum = 1 + '1'
f.close()
except (OSError,TypeError) as reason:
print('出错了:' + str(reason))
3.如果只是希望出错后反馈一个用户能看得懂的异常,可以:
但是不推荐这么做,一方面,这不利于编程人员判断出错类型;另一方面,如果用户只是单纯地想用ctrl+c来终止程序运行,也会返回一个 “出错啦T_T” 的提示。因为ctrl + c返回的KeyboardInterrupt异常会被except捕获。
4.try语句的检测范围内一旦出现异常,剩下的语句不会被执行:
下图中,执行到int('abc')时出现异常,检测范围内第3-6行的代码跳过不执行,由于except中没有包含此异常,故后面的except的内容也不执行。
再如下图,执行到sum = 1 + '1'出现异常,直接跳到第二个except处继续执行,中间部分一概不执行。
5.同时对多个异常进行统一处理:
不论是捕获到OSError还是TypeError,都会打印‘出错啦T_T’。
形式二:try-finally
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
finally:
无论如何都会被执行的代码
对如下例子,当执行到sum = 1 + '1'时会跳过f.close(),这会使得打开的文件没有关闭,写入的内容没有被保存,引起数据丢失。
而使用try-finally就可以很好地解决该问题:
raise语句
raise Exception[(相关的解释文本字符串)]
例如:
如果只有raise:
返回 运行异常:没有可用于激活的异常
课后作业
测试题:来自:bbs.fishc.com
bw$Bfr9;y={._zN4dPk`-@]
0. 我们使用什么方法来处理程序中出现的异常?
答::
使用 try……except 搭配来捕获处理程序中出现的异常。"Xj=$)R
try:版权属于:bbs.fishc.com
检测范围来自:bbs.fishc.com
except Exception[as reason]:r&Fijw]E
出现异常(Exception)后的处理代码Y%f+
1. 一个 try 语句可以和多个 except 语句搭配吗?为什么?gwX#5
答:可以。因为 try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。
2. 你知道如何统一处理多类异常吗?版权属于:bbs.fishc.com
答:例如:
try:
f = open('s.txt')
sum = 1 + '1'
f.close()
except (OSError,TypeError) as reason:
print('出错了:' + str(reason))
3. except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?nu^:M.jzD
答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常。
4. 如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?}ucH'CD
答:使用try-finally形式,在finally:后加上关闭文件的代码。
5. 请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。1;`Ji(uD
Jxy{ODSM}YA^is?X0PFK4LB;
代码:Powered by bbs.fishc.com
Jn({ZUA"tcP3^*MKF+!g#L7kC_
输出:版权属于:bbs.fishc.com
答:
try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt
print(i,j)
except KeyboardInterrupt:
print('退出啦!')
启发:可以利用try-except形式和raise制造异常的搭配跳出多重循环。
动动手:Powered by bbs.fishc.com
#8wV*QdE@"_{lnT t6H`sS;-IA&N2C
0. 还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。.j7Av`@lw
<WsJ7wUDf8T$F^Z3;->B
猜数字小游戏:版权属于:bbs.fishc.com
import random
secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
guess = int(temp)
while guess != secret:
temp = input("哎呀,猜错了,请重新输入吧:")
guess = int(temp)
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")
答:
import random
secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
try:
guess = int(temp)
except ValueError:
print('输入错误!')
guess = secret
while guess != secret:
temp = input("哎呀,猜错了,请重新输入吧:")
guess = int(temp)
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")
j{1
1. input() 函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键 Ctrl+d 产生)和 KeyboardInterrupt(取消输入,当用户按下组合键 Ctrl+c 产生),再次修改上边代码,捕获处理 input() 的两类异常,提高用户体验。
答:
import random
secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
guess = int(temp)
except (ValueError,EOFError,KeyboardInterrupt):
print('输入错误!')
guess = secret
while guess != secret:
temp = input("哎呀,猜错了,请重新输入吧:")
guess = int(temp)
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")
2. 尝试一个新的函数 int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。%[?gvfFR:T
C$B<tDMescZ.,G2gHFXPb[k*LT}"a5
程序实现如图:
答:
def int_input():
while 1:
temp = input('请输入一个整数:')
try:
result = int(temp)
break
except ValueError:
print('出错,您输入的不是整数!')
return result
int_input()
3. 把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在"My_File.txt"这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?Z$h~
try:
f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
f.close()
答:报错:
出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
File "C:\Users\57574\Desktop\test.py", line 9, in <module>
f.close()
NameError: name 'f' is not defined
解决办法:
try:
f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功
f.close()