033:异常处理:你不可能总是对的2
来源:互联网 发布:淘宝5元红包坑坏卖家 编辑:程序博客网 时间:2024/05/17 09:36
笔记:
try语句:
try: 检测范围except Exception[as reason]: 出现异常(Exception)后的处理代码
try-finally语句:
<span style="font-size:10px;">try: 检测范围except Exception[as reason]: 出现异常(Exception)后的处理代码finally: 无论如何都会被执行的代码</span>
raise语句:
raise 异常的名字
>>> raise ZeroDivisionError('除数为零的异常')<span style="color:#ff0000;">Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> raise ZeroDivisionError('除数为零的异常')ZeroDivisionError: 除数为零的异常</span>>>>
测试题:
0. 我们使用什么方法来处理程序中出现的异常?`答:使用 try……except 搭配来捕获处理程序中出现的异常。
try:
检测范围来自:bbs.fishc.com
except Exception[as reason]:
出现异常(Exception)后的处理代码
try:
检测范围来自:bbs.fishc.com
except Exception[as reason]:
出现异常(Exception)后的处理代码
1. 一个 try 语句可以和多个 except 语句搭配吗?为什么?
答:可以。因为 try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。
try: sum = 1 + '1' f = open('我是一个不存在的文档.txt') print(f.read()) f.close()except OSError as reason: print('文件出错啦T_T\n错误原因是:' + str(reason))except TypeError as reason: print('类型出错啦T_T\n错误原因是:' + str(reason))
答:在 except 后边使用小括号“()”把多个需要统一处理的异常括起来:
try: int('abc') sum = 1 + '1' f = open('我是一个不存在的文档.txt') print(f.read()) f.close()except (OSError, TypeError): print('出错啦T_T\n错误原因是:' + str(reason))
3. except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?
答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常。
4. 如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?
答:我们可以使用 finally 语句来实现,如果 try 语句块中没有出现任何运行时错误,会跳过 except 语句块执行 finally语句块的内容。
如果出现异常,则会先执行 except 语句块的内容再接着执行 finally 语句块的内容。总之,finally 语句块里的内容就是确保无论如何都将被执行的内容!
5. 请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
代码:
输出:
参考答案:
try: for i in range(3): for j in range(3): if i == 2: raise KeyboardInterrupt print(i, j)except KeyboardInterrupt: print('退出啦!')
动动手:
0. 还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。)
答:这里对可能导致异常的 guess = int(temp) 进行监测
import randomsecret = random.randint(1,10)print('------------------我爱鱼C工作室------------------')temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")try: guess = int(temp)except ValueError: print('输入错误!') guess = secretwhile guess != secret: temp = input("哎呀,猜错了,请重新输入吧:") guess = int(temp) if guess == secret: print("我草,你是小甲鱼心里的蛔虫吗?!") print("哼,猜中了也没有奖励!") else: if guess > secret: print("哥,大了大了~~~") else: print("嘿,小了,小了~~~")print("游戏结束,不玩啦^_^")
1. input() 函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键 Ctrl+d 产生)和 KeyboardInterrupt(取消输入,当用户按下组合键 Ctrl+c 产生),再次修改上边代码,捕获处理 input() 的两类异常,提高用户体验。
import randomsecret = random.randint(1,10)print('------------------我爱鱼C工作室------------------')try: temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:") guess = int(temp)except (ValueError, EOFError, KeyboardInterrupt): print('输入错误!') guess = secretwhile guess != secret: temp = input("哎呀,猜错了,请重新输入吧:") guess = int(temp) if guess == secret: print("我草,你是小甲鱼心里的蛔虫吗?!") print("哼,猜中了也没有奖励!") else: if guess > secret: print("哥,大了大了~~~") else: print("嘿,小了,小了~~~")print("游戏结束,不玩啦^_^")
程序实现如图:
def int_input(prompt=''): while True: try: int(input(prompt)) break except ValueError: print('出错,您输入的不是整数!')int_input('请输入一个整数:')
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\FishC000\Desktop\test.py", line 7, 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()
0 0
- 033:异常处理:你不可能总是对的2
- 第32讲:异常处理:你不可能总是对的
- 第32讲:异常处理:你不可能总是对的
- FishC笔记—33 讲 异常处理:你不可能总是对的2
- FishC笔记—32 讲 异常处理:你不可能总是对的
- 032:异常处理:你不可能永远是对的
- 对异常的处理
- 你不可能在乎的声音
- JAVA解惑你的不可能
- 异常处理对效率的影响——你不知道的异常(三)
- 建议65:总是处理未捕获的异常
- C#对异常的处理
- 对ARM的异常处理
- 对异常捕获的处理
- springMVc对异常的处理
- 内核对异常的处理
- 对数据的异常处理
- NodeJS对异常的处理
- 阿里巴巴常考面试题及汇总答案
- 程序员如何快速准备面试中的算法
- 编写一个函数reverse_string(char * string)(递归实现)
- 【MFC】头文件内的函数重定义问题
- AEAI Portal手机门户配置手册
- 033:异常处理:你不可能总是对的2
- android日期事件管理
- 求职之路
- 在Eclipse里自动导入相应包的类名的快捷键
- android4.2及之后开启手机多用户功能的笔记
- Mysql MERGE引擎简介
- Qt 读写Excel,并显示到tablewidget
- Java连接access
- Linux下eclipse编译C++动态链接库报错问题解决