小甲鱼《零基础学习Python》课后笔记(三十三):异常处理——你不可能总是对的2
测试题 0.我们使用什么方法来处理程序中出现的异常? 使用try方法,包括try-except语句和try-finally语句。 ①try-except
try:
检测范围
except 异常类型 as e:
对应异常的处理程序
②try-finally
try:
检测范围
except 异常类型 as e:
对应异常的处理程序
finally:
无论如何都会执行的代码
1.一个try语句可以和多少个except语句搭配?为什么?
可以,因为except可以和多种异常类型搭配,处理多种异常。 2.你知道如何统一处理多类异常吗? 使用except (Exception1, Exception2, Exception3…),这样只要是括号里出现的异常,都会执行except后的异常处理程序。 3.except后如果不带任何异常类,Python会捕获所有(try语句块内)的异常并统一处理,但小甲鱼不建议这么做,你知道为什么吗? 因为这样会屏蔽掉程序员未考虑到的异常,不利于程序的调试和维护,就算出错也不知道具体异常。 4.如果异常发生在成功打开文件后,Python跳到except语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢? 可以使用try-finally语句,在finally语句里f.colse()对文件进行关闭保存。 5.请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt
print(i, j)
except KeyboardInterrupt:
print('退出啦!')
raise可以产生异常。
动动手 0.还记得我们额小游戏吗?只要用户输入非整形数据,程序立刻就会蹦出不和谐的异常信息然后奔溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。
import random
secret = random.randint(1,10)
i = 3
temp = input("猜一猜Allen心中的数字:")
number = int(temp)
while (i > 0):
if(number == secret):
print("哇,你是Allen肚里的蛔虫吗?")
print("奖励一个香吻!")
break
else:
if number > secret:
print("大了大了!")
else:
print("小了小了!")
if i > 1:
temp = input("哎呀!再猜猜看:")
number = int(temp)
i = i -1
print("游戏结束,不玩啦!")
修改后:
import random
secret = random.randint(1,10)
i = 3
temp = input("猜一猜Allen心中的数字:")
while True:
try:
number = int(temp)
except ValueError as reason:
print('类型出错啦n' + str(reason))
break
number = int(temp)
while (i > 0):
if(number == secret):
print("哇,你是Allen肚里的蛔虫吗?")
print("奖励一个香吻!")
break
else:
if number > secret:
print("大了大了!")
else:
print("小了小了!")
if i > 1:
temp = input("哎呀!再猜猜看:")
number = int(temp)
i = i -1
print("游戏结束,不玩啦!")
break
这里加了2个break,主要是except语句处理后不会退出程序,而且还会报错NameError: name ‘number’ is not defined,所以做了改进。
1.input()函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键Ctrl+d产生)和KeyboardInterrupt(取消输入,当用户按下组合键Ctrl+c产生),再次修改上边的代码,捕获处理input()的两类异常,提高用户体验。
import random
secret = random.randint(1,10)
i = 3
while True:
try:
temp = input("猜一猜Allen心中的数字:")
number = int(temp)
except (ValueError, EOFError, KeyboardInterrupt) as reason:
print('类型出错:' + str(reason))
break
number = int(temp)
while (i > 0):
if(number == secret):
print("哇,你是Allen肚里的蛔虫吗?")
print("奖励一个香吻!")
break
else:
if number > secret:
print("大了大了!")
else:
print("小了小了!")
if i > 1:
temp = input("哎呀!再猜猜看:")
number = int(temp)
i = i -1
print("游戏结束,不玩啦!")
break
2.尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。程序实现如图:
def int_input():
while True:
try:
number = int(input('请输入一个整数:'))
break
except ValueError:
print('出错,您输入的不是整数!')
3.把文件关闭放在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在“My_File.txt”这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
try:
f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
f.close()
出现异常,因为试图关闭一个不存在的文件对象
================== RESTART: I:Python小甲鱼test003test0.py ==================
出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
File "I:Python小甲鱼test003test0.py", line 7, in <module>
f.close()
NameError: name 'f' is not defined
修改后:
try:
f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
if 'f' in locals(): #如果文件对象变量存在当前局部变量符号表的话,说明打开成功
f.close()
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android中使用AsyncTask实现下载文件动态更新进度条功能
- 在CentOS VPS上通过SSH安装 MySQL的方法图解
- 使用vs2019进行Linux远程开发的方法步骤
- Android WebView的使用方法总结
- Android继承ViewGroup实现Scroll滑动效果的方法示例
- Linux内核设备驱动之字符设备驱动笔记整理
- Android 中在有序广播中添加自定义权限的实例
- 在 CentOS 8 上安装Jenkins的方法
- Android使用DrawerLayout实现侧滑菜单效果
- android语音即时通讯之录音、播放功能实现代码
- win10 装centos7 虚拟机
- 怎样给centos系统扩展磁盘分区的实现方法
- android系统分享的自定义功能的示例代码
- Linux centOS安装JDK和Tomcat的教程
- Android ContentProvider实现获取手机联系人功能