day7异常处理
异常处理
下面看一个简单例子:
data = {} try:
data["name"]
except KeyError as e: #e是错误的相信信息,错误的原因
print("没有这个key",e)
运行结果如下:
没有这个key 'name'
从上面结果可以看出,当出现错误的时候,我们可以使用try.....except来规避错误,不让程序报错。能够继续运行。其中as e是错误的明细,原因。
多种错误扑捉的方法:(1)
data = {} try:
data["name"]
except KeyError as e: #e是错误的相信信息,错误的原因
print("没有这个key",e)
except IndexError as e:
print("列表索引错误",e)
多种错误扑捉方法:(2)
data = {}
names = []
try:
names[]
except (IndexError,KeyError) as e: #e是错误的相信信息,错误的原因
print("列表索引错误",e)
把多种错误原因放到元素中,自动查找术语那种错误。
Exception抓取基本上所有的错误,一般情况下不建议使用,使用的话放在最后,上面的错误都抓取不到的时候,就最后抓取一次。
异常
try:
code
except (Error1,Error2) as e:
print(e)
except Exception:抓取所有错误,一般不建议使用,使用放在最后一次抓取上。如下:
data = {}
names = []
num =
try:
num/
except (IndexError,KeyError) as e: #e是错误的相信信息,错误的原因
print("列表索引错误",e) except FileNotFoundError as e:
print("文件不存在",e) except Exception as e:
print("未知错误",e)
运行结果如下:
未知错误 division by zero
上面代码中,except Exception就是用来处理上面所有的情况都抓取不到错误的时候执行的。经常就是所有努力都失败了才执行。
下面来看一下单元测试,我们经常会测试代码,如果出错了执行错误,如果没有出错,告诉我们没有问题,如下,代码测试:
data = {}
names = []
num =
try:
num/
except (IndexError,KeyError) as e: #e是错误的相信信息,错误的原因
print("列表索引错误",e) except FileNotFoundError as e:
print("文件不存在",e) except Exception as e:
print("未知错误",e) else:
print("一切OK")
运行结果如下:
未知错误 division by zero
上面代码中,我们知道1/0肯定是会报错的,因为会执行最后一个错误。但是else语句会执行吗?可以从运行结果看没有执行,那么我们来看下正确的情况下:
data = {}
names = []
num =
try:
num/
except (IndexError,KeyError) as e: #e是错误的相信信息,错误的原因
print("列表索引错误",e) except FileNotFoundError as e:
print("文件不存在",e) except Exception as e:
print("未知错误",e) else:
print("一切OK")
运行结果如下:
一切OK
从代码的运行结果可以看出,当没有错误的时候,执行了else语句,由此我们可以看出,当程序执行遇到错误的时候执行错误,不会执行else语句,当程序运行正常的时候,会执行else语句,告诉我们程序没有出现异常错误。这种情况常用在测试上,错误返回错误,正常返回正常。
下面来看下无论是否出错都执行的,finally:
没有异常的时候:
data = {}
names = []
num =
try:
num/
except (IndexError,KeyError) as e: #e是错误的相信信息,错误的原因
print("列表索引错误",e) except FileNotFoundError as e:
print("文件不存在",e) except Exception as e:
print("未知错误",e) else:
print("一切OK") finally:
print("不管有没有错,都执行!!!")
运行结果如下:
一切OK
不管有没有错,都执行!!!
上面可以看出,代码没有异常的时候执行了finally语句。
下面来看下,代码正常的时候的情况:
data = {}
names = []
num =
try:
num/
except (IndexError,KeyError) as e: #e是错误的相信信息,错误的原因
print("列表索引错误",e) except FileNotFoundError as e:
print("文件不存在",e) except Exception as e:
print("未知错误",e) else:
print("一切OK") finally:
print("不管有没有错,都执行!!!")
运行结果如下:
未知错误 division by zero
不管有没有错,都执行!!!
从上面运行结果可以看出,当错误的时候,else语句没有执行,但是finally语句继续执行。说明无论什么样的情况下,finally语句都会正常执行。
python中的异常种类非常多,每个异常专门用于处理某一项异常!!!
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
自定义异常:
我们在连接数据库的时候,如果连接错误,会出现异常,这种异常Python自带的异常是抓取不到的,因此只能自己抓取。这个时候就需要自定义异常。如下:
class MysqlConnectError(Exception):
def __init__(self, msg):
self.message = msg def __str__(self):
return self.message
try:
raise MysqlConnectError('我的异常')
except MysqlConnectError as e:
print(e)
运行结果如下:
我的异常
上面就是自己定义的异常处理情况。
总结如下
except
语句不是必须的,finally
语句也不是必须的,但是二者必须要有一个,否则就没有try
的意义了。except
语句可以有多个,Python会按except
语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except
语句。except
语句可以以元组形式同时指定多个异常,参见实例代码。except
语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。如果要捕获异常后要重复抛出,请使用
raise
,后面不要带任何参数或信息。不建议捕获并抛出同一个异常,请考虑重构你的代码。
不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。
尽量使用内置的异常处理语句来 替换try/except语句,比如
with
语句,getattr()
方法。
day7异常处理的更多相关文章
- Python异常处理总结
一.何谓异常处理 在我们调试程序时,经常不可避免地出现意料之外的情况,导致程序不得不停止运行,然后提示大堆提示信息,大多是这种情况都是由异常引起的.异常的出现一方面是因为写代码时粗心导致的语法错误,这 ...
- Python基础 小白[7天]入门笔记
笔记来源 Day-1 基础知识(注释.输入.输出.循环.数据类型.随机数) #-*- codeing = utf-8 -*- #@Time : 2020/7/11 11:38 #@Author : H ...
- Python之旅Day7 面向对象&异常处理
########################################面向对象初识######################################### 面向对象简介 面向对象编 ...
- Python Day7
概述 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法 ...
- Python之路,Day7 - 面向对象编程进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- python学习之路-day7
本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 面向对象高级语法部分 静态方法 ...
- Python-Day7 面向对象进阶/异常处理/Socket
一.面向对象高级语法部分 1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里 ...
- Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...
随机推荐
- 数据分析与展示---Pandas库入门
简介 一:Pandas库的介绍 二:Pandas库的Series类型 (一)索引 (1)自动索引 (2)自定义索引 (二)Series类型创建 (1)列表创建 (2)标量值创建 (3)字典类型创建(将 ...
- (转)Tomcat配置调优与安全总结
tomcat配置调优与安全总结 作为运维,避免不了与tomcat打交道,然而作者发现网络上关于tomcat配置和调优安全的文章非常散,通过参考各位大神的相关技术文档,根据作者对tomcat的运维经验, ...
- COGS 1516. 棋盘上的车
COGS 1516. 棋盘上的车 http://www.cogs.pro/cogs/problem/problem.php?pid=1516 ☆ 输入文件:rook.in 输出文件:rook. ...
- codevs 3152 装箱问题3
装箱问题3 http://codevs.cn/problem/3152/ 题目描述 Description 设有n种物品,记作A1.A2.….An,对应于每个Ai(1<=i<=n)都有一个 ...
- Jenkins + jmeter + ant + git 自动化集成
背景: 目前测试组项目多,手头任务紧,且回归测试任务量较大,经过组内讨论采用相对快速高效的方式(自动化接口测试类型),在迭代任务中把主要精力集中在新需求测试:而回归测试时,主要采用自动化测试,提高测 ...
- c++虚函数&重写
虚函数是C++中实现多态的一种方法,父类A的一个函数声明为虚函数,在子类B中覆盖定义之后,当在调用的时候使用A*a=new B(),此时调用对应的那个虚函数的名字,则会执行B中的函数.当父类中没有定义 ...
- MongoDB - MongoDB CRUD Operations, Bulk Write Operations
Overview MongoDB provides clients the ability to perform write operations in bulk. Bulk write operat ...
- angularJS $resource
$resource是一个更方便地与RESTful服务器API进行交互,可以方便地定义一个REST资源,而不必手动所有的声明CRUD方法的Service. 使用 1.要使用$resource首先要在HT ...
- 关于thinkpad安装win10操作系统
thinkpad预装的是win8或者win10,会有自己的分区方式是GPT,所以会出现两个引导分区. F2进入tinkpad的bios,F12进入启动选项 我们用pe进入后,用分区工具删除两个分区,然 ...
- dup()&dup2()
[dup()&dup2()] 都是复制文件描述符指针.dup2可以指定复制到哪一个新索引. 参考:http://hi.baidu.com/flikecn/item/e82e14bef06e8a ...