零基础入门学习Python(33)--异常处理:你不可能总是对的2
知识点
异常处理
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try语句按照如下方式工作:
- 首先,执行try子句(在关键字try和关键字except之间的语句)
- 如果没有异常发生,忽略except子句,try子句执行后结束。
- 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try语句之后的代码。
- 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
实例1(未发生异常)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f1 = open("testfile.txt", "w")
f1.write("这是一个测试文件,用于测试异常!!")
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
f1.close()
====输出结果:====
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
内容写入文件成功
===查看testfile.txt文件内容:===
这是一个测试文件,用于测试异常!!
实例2(发生异常)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f1 = open("testfile.txt", "r")
f1.read()
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
f1.close()
====输出结果:====
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
Error: 没有找到文件或读取文件失败
实例3(发生异常并显示错误代码)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f1 = open("testfile.txt", "r")
f1.read()
except IOError as ercode:
print("Error: 没有找到文件或读取文件失败,错误代码为:" + str(ercode))
else:
print("内容写入文件成功")
f1.close()
====输出结果:====
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
Error: 没有找到文件或读取文件失败,错误代码为:[Errno 2] No such file or directory: 'testfile.txt'
一个try语句包含多个except子句
分别来处理不同的特定的异常。最多只有一个分支会被执行。
实例4(含有多个except子句)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
a = 1/0
f1 = open("testfile.txt", "r")
f1.read()
except ZeroDivisionError:
print('出现错误,原因是:余数不能为0')
except IOError as ercode:
print("Error: 没有找到文件或读取文件失败,错误代码为:" + str(ercode))
else:
print("内容写入文件成功")
f1.close()
====输出结果:====
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
出现错误,原因是:余数不能为0
一个except带多种异常类型
实例5(一个except带多种异常类型)
#一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元祖,例如:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f1 = open("testfile.txt", "w+")
f1.read()
a = 1 / 0
except (IOError,ZeroDivisionError) as ercode:
print("发生错误了,错误代码为:" + str(ercode))
else:
print("内容写入文件成功")
f1.close()
====输出结果:====
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
发生错误了,错误代码为:division by zero
使用except而不带任何异常类型
实例6(使用except不带异常类型,相当于通配符)
# 这种方式try-except语句捕获所有发生的异常。但这不是一个很好的方式,
# 我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f1 = open("testfile.txt", "r")
f1.read()
a = 1 / 0
except:
print('发生错误了')
===输出结果===
D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
发生错误了
try-finally语句
try-finally 语句无论是否发生异常都将执行最后的代码。
实例7(finally)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f = open('d:/我为什么是一个文件.txt','w')
print(f.write('我存在了!'))
sum = 1 + '1'
except (OSError,TypeError) as err:
print('出错了,错误原因是:' + str(err))
===查看文件内容:===
空白
#添加子句finally后:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
try:
f = open('d:/我为什么是一个文件.txt','w')
print(f.write('我存在了!'))
sum = 1 + '1'
except (OSError,TypeError) as err:
print('出错了,错误原因是:' + str(err))
finally:
f.close()
===输出结果====
==================== RESTART: D:\untitled\Python_learn\test1.py =================
5 #写入5个字符
出错了,错误原因是:unsupported operand type(s) for +: 'int' and 'str'
===查看文件内容:===
我存在了
raise语句
raise 语句允许程序员强制抛出一个指定的异常。例如:
>>> raise NameError('未定义的变量')
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise NameError('未定义的变量')
NameError: 未定义的变量
要抛出的异常由raise的唯一参数标识。它必需是一个异常实例或异常类(继承自Exception的类)。
如果你需要明确一个异常是否跑出,但不想处理它,raise语句可以让你很简单的重新抛出该异常:
try:
raise NameError('未定义变量')
except NameError:
print('一个异常产生')
===========输出结果=================
一个异常产生
try:
raise NameError('未定义变量')
except NameError:
print('一个异常产生')
raise
===========输出结果=================
一个异常产生
Traceback (most recent call last):
File "<pyshell#8>", line 2, in <module>
raise NameError('未定义变量')
NameError: 未定义变量
课后习题
动动手
- 我们使用什么方法来处理程序中出现的异常?
使用try ...except搭配来捕获处理程序中出现的异常
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
- 一个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))
- except后边如果不带任何异常类,python会捕获所有(try语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?
因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入ctrl + c试图终止程序会被解释为KeyboardInterrupt异常。
- 如果异常发生在成功打开文件后,Python跳到except语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?
我们可以使用finally语句来实现,如果try语句块中没有出现任何运行时错误,会跳过except语句块执行finally语句块的内容。
如果出现异常,则会先执行except语句块的内容再接着执行finally语句块的内容。总之,finally语句块里的内容就是确保无论如何都将被执行的内容!
- 请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt
print(i, j)
except KeyboardInterrupt:
print('退出啦!')
动动手:
- 还记得我们第一个小游戏吗?只要用户输入非整形数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。
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('输入的有误,',end = '')
guess = 0
while guess != secret:
temp = input("请重新输入吧:")
try:
guess = int(temp)
except:
print('输入的有误,',end='')
continue
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")
- 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 (KeyboardInterrupt,EOFError,ValueError):
print('输入的有误,',end = '')
guess = 0
while guess != secret:
try:
temp = input("请重新输入吧:")
guess = int(temp)
except (KeyboardInterrupt,EOFError,ValueError):
print('输入的有误,',end='')
continue
if guess == secret:
print("我草,你是小甲鱼心里的蛔虫吗?!")
print("哼,猜中了也没有奖励!")
break
else:
if guess > secret:
print("哥,大了大了~~~")
else:
print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")
- 尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。
def int_input(prompt=''):
while True:
try:
print(int(input(prompt)))
break
except ValueError:
print('出错,您输入的不是整数!')
int_input('请输入一个整数:')
- 把文件关闭放在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在
My_File。txt这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
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 "D:\untitled\Python_learn\test1.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()
零基础入门学习Python(33)--异常处理:你不可能总是对的2的更多相关文章
- 【Python教程】《零基础入门学习Python》(小甲鱼)
[Python教程]<零基础入门学习Python>(小甲鱼) 讲解通俗易懂,诙谐. 哈哈哈. https://www.bilibili.com/video/av27789609
- 《零基础入门学习Python》【第一版】视频课后答案第001讲
测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...
- 零基础入门学习Python(1)--我和Python的第一次亲密接触
前言 最近在学习Python编程语言,于是乎就在网上找资源.其中小甲鱼<零基础入门学习Python>试听了几节课,感觉还挺不错,里面的视频都是免费下载,小甲鱼讲话也挺幽默风趣的,所以呢,就 ...
- 学习参考《零基础入门学习Python》电子书PDF+笔记+课后题及答案
国内编写的关于python入门的书,初学者可以看看. 参考: <零基础入门学习Python>电子书PDF+笔记+课后题及答案 Python3入门必备; 小甲鱼手把手教授Python; 包含 ...
- 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案
初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...
- 零基础入门学习Python(36)--类和对象:给大家介绍对象
知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...
- 零基础入门学习Python(17)--函数:Python的乐高积木
前言 相信大家小时候都玩过神奇的乐高积木, 只要通过想象力和创造力我们可以拼凑很多神奇的东西,那么随着我们学习的深入,我们编写的Python代码也将日益增加,并且也越来越复杂, 所以呢,我们需要找寻一 ...
- 零基础入门学习Python(32)--异常处理:你不可能总是对的
知识点 即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常. 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: Python标准异常总结 序 ...
- 零基础入门学习Python(35)--图形用户界面入门:EasyGui
知识点 EasyGui学习文档[超详细中文版] 1. 建议不要在IDLE上运行EasyGui EasyGui是运行在TKinter上并拥有自身的事件循环,而IDLE也是Tkinter写的一个应用程序并 ...
随机推荐
- U3D中碰撞体和刚体的关系
1.刚体是用来接受力作用的组件: 2.碰撞体是碰撞系统用来检测碰撞的组件: 碰撞产生碰撞信息,游戏物体根据碰撞信息生成一个力作用在刚体上,刚体受力后就会产生一个速率,最终在游戏物体的运动体现出来. 也 ...
- nginx下配置虚拟主机
linux 虚拟机下配置虚拟主机 nginx.conf 文件不动, 在 conf.d 或者 conf 目录下 新建项目.conf server { listen 80; server_name loc ...
- (8)css表格
用css设置表格样式 *<table></table> 标签定义 HTML 表格. * tr 元素定义表格的行:th 元素定义表格的表头:td 元素定义表格中的单元格:capt ...
- Docker+Jenkins+Git发布SpringBoot应用
Doccker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之 ...
- 洛谷P2384 最短路(dijkstra解法)
题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...
- Hibernate3的hbm文件错误引用dtd文件导致项目无法启动问题处理
错误信息: org.hibernate.InvalidMappingException: Could not parse mapping document from resource /***/*** ...
- iOS生成PDF的关键代码-备忘
//此方法只是把当前页面的内容生成PDF并保存在沙盒中. //还需要做:把当前面没有显示的内容以分页的形式生成PDF,并把PDF读取并显示出来 //关于显示可以参考:念茜的博客 iOS开发笔记——PD ...
- 424 Longest Repeating Character Replacement 替换后的最长重复字符
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...
- 1270 数组的最大代价 dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270&judgeId=194704 一开始贪心,以为就两种情况, ...
- SpringBoot之旅第七篇-Docker
一.引言 记得上大三时,要给微机房电脑安装系统,除了原生的操作系统外,还要另外安装一些必要的开发软件,如果每台电脑都重新去安装的话工作量就很大了,这个时候就使用了windows镜像系统,我们将要安装的 ...