python高级-异常(13)
一、异常介绍
print("1---------------------") open("123.txt","r") print("2---------------------")
运行结果为:
1--------------------- Traceback (most recent call last):File "C:\Users\Se7eN_HOU\Desktop\demo.py", line 2, in <module>open("123.txt","r") FileNotFoundError: [Errno 2] No such file or directory: '123.txt'
说明:打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错误,No such file or directory:123.txt (没有123.txt这样的文件或目录)
异常:当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的”异常”
二、捕获异常
try…except…
try:print("1---------------------")open("123.txt","r")print("2---------------------")except IOError:pass
运行结果为:1---------------------
说明:
- 此程序看不到任何错误,因为用except 捕获到了IOError异常,并添加了处理的方法
- pass 表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息
- 把可能出现问题的代码,放在try中
- 把处理异常的代码,放在except中
三、except捕获多个异常
try:print(num) except IOError:print("产生的错误")
运行结果为:
Traceback (most recent call last):File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 2, in <module>print(num) NameError: name 'num' is not defined
上例程序,已经使用except来捕获异常了,为什么还会看到错误的信息提示?因为:except捕获的错误类型是IOError,而此时程序产生的异常为 NameError ,所以except没有生效
修改后的代码为:
try:print(num) except NameError:print("产生的错误")
运行结果为:产生的错误
实际开发中,捕获多个异常的方式,如下:
try:print("1---------------------")open("123.txt","r")print("2---------------------")print(num) except (IOError,NameError):print("产生的错误")
运行结果为:
1--------------------- 产生的错误
当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储
四、获取异常的信息描述
try:print("1---------------------")open("123.txt","r")print("2---------------------") except Exception as e:#Exception是异常类,e是捕获到的异常print(e)
运行结果为:
1--------------------- [Errno 2] No such file or directory: '123.txt'
五、else
在if中,else的作用是当条件不满足时执行的实行;同样在try…except…中也是如此,即如果没有捕获到异常,那么就执行else中的事情
try:num = 100 except Exception as e:#Exception是异常类,e是捕获到的异常print("产生错位了:%s"%e) else:print("没有捕获异常,真高兴")
运行结果为:没有捕获异常,真高兴
六、try…finally…
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
import timetry:f = open("test.txt")try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)print(content)except :#如果再读取文件的过程中,产生了异常,那么就会捕获到#比如 按下 ctrl + cpassfinally:f.close()print("关闭文件") except :print("没有这个文件")
test.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl+c中断(取消)程序。
我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭。
七、异常的传递
def test1():print("------test1-1-------")print(num)print("------test1-2-------")def test2():print("------test2-1-------")test1()print("------test2-2-------")def test3():try:print("------test3-1-------")test1()print("------test3-2-------")except Exception as e:print("捕获到了异常,信息是:%s"%e)test3() print("--------------------------------------") test2()
运行结果为:
------test3-1------- ------test1-1------- 捕获到了异常,信息是:name 'num' is not defined -------------------------------------- ------test2-1------- ------test1-1------- Traceback (most recent call last):File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 21, in <module>test2()File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 8, in test2test1()File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 3, in test1print(num) NameError: name 'num' is not defined
- 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
- 如果一个异常是在一个函数中产生的,例如函数A—->函数B—->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样
- 注意观察上图中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行
八、抛出自定义的异常
用raise语句来引发一个异常。异常/错误对象必须有一个名字,且它们应是Error或Exception类的子类
class ShortInputException(Exception):def __init__(self,length,atleast):self.length = lengthself.atleast = atleastdef main():try:s = input("请输入:")if len(s)<3:raise ShortInputException(len(s),3)except ShortInputException as e:print("ShortInputException:输入的长度是%d,长度至少是%d"%(e.length,e.atleast))else:print("没有发生异常")main()
运行结果为:
请输入:qw
ShortInputException:输入的长度是2,长度至少是3
请输入:qwert
没有发生异常
转载于:https://www.cnblogs.com/Se7eN-HOU/p/10698419.html
python高级-异常(13)相关推荐
- Python高级编程——13.垃圾回收机制
垃圾回收(了解) 1.1 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257 ...
- Python程序设计与科学计算精录总结Episode.3 Python高级语法:文件、异常、标准库和问题解决模式知识总结(基于Michael导师Python课程与VS2019)
今天是2020年5月20日,这个对于博主来说平凡的一天,但社交媒体上早就炸开锅了. 博主认为,有些人受过伤之后,就爱的小心翼翼,迟迟不敢去再次追求自己的另一半,就这样,渐渐的过了能够大胆去爱的年纪,一 ...
- Python学习笔记(五) Python高级特性
Python高级特性 一. 切片 python中提供了切片(Slice)操作符 , 可以方便的获取list或tuple中的某一段元素 . # -*- coding : utf-8 -*- #Pytho ...
- Python 高级网络操作 - Python Advanced Network Operations
1 Python 高级网络操作 - Python Advanced Network Operations 2 3 Half Open Socket, 4 一个单向的 socket 被称为 half o ...
- python浓缩(13)面向对象编程
为什么80%的码农都做不了架构师?>>> 本章主题 ? 引言 ? 面向对象编程 ? 类 ? 实例 ? 绑定与方法调用 ? 子类,派生和继承 ? 内建函数 ? 定制类 ? 私有性 ...
- python架构师培训课程_Python从零到架构师课程 六大阶段Python高级课程+项目实战 尚学堂全方位Python课程...
Python从零到架构师课程 六大阶段Python高级课程+项目实战 尚学堂全方位Python课程 3.JPG (31.16 KB, 下载次数: 1) 2019-9-17 23:36 上传 2.JP ...
- python高级编程之网络编程
Python高级之网络编程 端口 端口分类 知名端口 动态端口 查看端口 socket简介 电脑上进程之间的通信 什么是socket 创建socket 使用UDP套接字发送数据 使用UDP套接字接受数 ...
- Python 高级编程(第2版)
内容简介 Python 作为一种高级程序设计语言,凭借其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言之一. 本书基于 Python 3.5 版本进行讲解,深度揭示了 Python 编程的高级 ...
- Python高级特性——切片(Slice)
Python高级特性--切片(Slice) 摘录廖雪峰网站 定义一个list: L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >> ...
最新文章
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
- [转载]2000/XP下删除隐藏旧网卡方法
- 我做产品的三大思维:发散、纵横和表里(上)
- jvm7 jvm8_我们真的仍然需要32位JVM吗?
- 华为交换机S3700-TELNET远程管理交换机配置
- python实现爬虫收集图片 花瓣网_Python爬虫日记七:批量抓取花瓣网高清美图并保存...
- php开源bi,Poli 简单易用的开源 BI 软件使用教程
- JAVA虚拟机环境如何在IMX6平台上搭建呢?
- iOS人脸识别(CoreImage)
- 亿图脑图-MindMaster-思维导图及亿图图示会员-史上超值活动
- 企业微信-通讯录管理-成员管理以及部门管理
- 一文读懂微生物扩增子16s测序
- 红米K30升级鸿蒙系统,Redmi K30 Pro变焦版相机免费升级,DxOMark版本马上到
- html调用properties,聊聊html中的properties和attributes
- 81个人脸关键点检测
- 用Xenu检查死链发现域名后有//
- 伤害世界怎么自建服务器,伤害世界服务器架设图文教程
- linux任务调度框架,任务调度框架Hangfire 简介
- 选择软件开发平台,“快速开发”是关键
- Progression Approximation---以无穷数列求和为例