一、异常介绍

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)相关推荐

  1. Python高级编程——13.垃圾回收机制

    垃圾回收(了解) 1.1 小整数对象池 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间. Python 对小整数的定义是 [-5, 257 ...

  2. Python程序设计与科学计算精录总结Episode.3 Python高级语法:文件、异常、标准库和问题解决模式知识总结(基于Michael导师Python课程与VS2019)

    今天是2020年5月20日,这个对于博主来说平凡的一天,但社交媒体上早就炸开锅了. 博主认为,有些人受过伤之后,就爱的小心翼翼,迟迟不敢去再次追求自己的另一半,就这样,渐渐的过了能够大胆去爱的年纪,一 ...

  3. Python学习笔记(五) Python高级特性

    Python高级特性 一. 切片 python中提供了切片(Slice)操作符 , 可以方便的获取list或tuple中的某一段元素 . # -*- coding : utf-8 -*- #Pytho ...

  4. Python 高级网络操作 - Python Advanced Network Operations

    1 Python 高级网络操作 - Python Advanced Network Operations 2 3 Half Open Socket, 4 一个单向的 socket 被称为 half o ...

  5. python浓缩(13)面向对象编程

    为什么80%的码农都做不了架构师?>>>    本章主题 ? 引言 ? 面向对象编程 ? 类 ? 实例 ? 绑定与方法调用 ? 子类,派生和继承 ? 内建函数 ? 定制类 ? 私有性 ...

  6. python架构师培训课程_Python从零到架构师课程 六大阶段Python高级课程+项目实战 尚学堂全方位Python课程...

    Python从零到架构师课程  六大阶段Python高级课程+项目实战 尚学堂全方位Python课程 3.JPG (31.16 KB, 下载次数: 1) 2019-9-17 23:36 上传 2.JP ...

  7. python高级编程之网络编程

    Python高级之网络编程 端口 端口分类 知名端口 动态端口 查看端口 socket简介 电脑上进程之间的通信 什么是socket 创建socket 使用UDP套接字发送数据 使用UDP套接字接受数 ...

  8. Python 高级编程(第2版)

    内容简介 Python 作为一种高级程序设计语言,凭借其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言之一. 本书基于 Python 3.5 版本进行讲解,深度揭示了 Python 编程的高级 ...

  9. Python高级特性——切片(Slice)

    Python高级特性--切片(Slice) 摘录廖雪峰网站 定义一个list: L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >> ...

最新文章

  1. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
  2. [转载]2000/XP下删除隐藏旧网卡方法
  3. 我做产品的三大思维:发散、纵横和表里(上)
  4. jvm7 jvm8_我们真的仍然需要32位JVM吗?
  5. 华为交换机S3700-TELNET远程管理交换机配置
  6. python实现爬虫收集图片 花瓣网_Python爬虫日记七:批量抓取花瓣网高清美图并保存...
  7. php开源bi,Poli 简单易用的开源 BI 软件使用教程
  8. JAVA虚拟机环境如何在IMX6平台上搭建呢?
  9. iOS人脸识别(CoreImage)
  10. 亿图脑图-MindMaster-思维导图及亿图图示会员-史上超值活动
  11. 企业微信-通讯录管理-成员管理以及部门管理
  12. 一文读懂微生物扩增子16s测序
  13. 红米K30升级鸿蒙系统,Redmi K30 Pro变焦版相机免费升级,DxOMark版本马上到
  14. html调用properties,聊聊html中的properties和attributes
  15. 81个人脸关键点检测
  16. 用Xenu检查死链发现域名后有//
  17. 伤害世界怎么自建服务器,伤害世界服务器架设图文教程
  18. linux任务调度框架,任务调度框架Hangfire 简介
  19. 选择软件开发平台,“快速开发”是关键
  20. Progression Approximation---以无穷数列求和为例

热门文章

  1. Samba 3.4.0 发布
  2. 基于OpenVINO的多输入model optimizer(Tensorflow)
  3. 微信小程序制作-随笔4
  4. JAVA 程序员需要用到 10 个测试框架和库
  5. Linux下清空回收站
  6. 基于Twemproxy的Redis集群方案
  7. 网页上无缝滚动的实现
  8. need to focus
  9. 高中理科不好学计算机,高一理科很差但想学理咋办
  10. 使用dom4j来解析相关的xml字符串