Python同时处理多个异常的方法


Posted in Python onJuly 28, 2020

问题

你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢?

解决方案

如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示:

try:
  client_obj.get_url(url)
except (URLError, ValueError, SocketTimeout):
  client_obj.remove_url(url)

在这个例子中,元祖中任何一个异常发生时都会执行 remove_url() 方法。 如果你想对其中某个异常进行不同的处理,可以将其放入另外一个 except 语句中:

try:
  client_obj.get_url(url)
except (URLError, ValueError):
  client_obj.remove_url(url)
except SocketTimeout:
  client_obj.handle_url_timeout(url)

很多的异常会有层级关系,对于这种情况,你可能使用它们的一个基类来捕获所有的异常。例如,下面的代码:

try:
  f = open(filename)
except (FileNotFoundError, PermissionError):
  pass

可以被重写为:

try:
  f = open(filename)
except OSError:
  pass

OSError FileNotFoundError PermissionError 异常的基类。

讨论

尽管处理多个异常本身并没什么特殊的,不过你可以使用 as 关键字来获得被抛出异常的引用:

try:
  f = open(filename)
except OSError as e:
  if e.errno == errno.ENOENT:
    logger.error('File not found')
  elif e.errno == errno.EACCES:
    logger.error('Permission denied')
  else:
    logger.error('Unexpected error: %d', e.errno)

这个例子中, e 变量指向一个被抛出的 OSError 异常实例。 这个在你想更进一步分析这个异常的时候会很有用,比如基于某个状态码来处理它。

同时还要注意的时候 except 语句是顺序检查的,第一个匹配的会执行。 你可以很容易的构造多个 except 同时匹配的情形,比如:

>>> f = open('missing')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'missing'
>>> try:
...   f = open('missing')
... except OSError:
...   print('It failed')
... except FileNotFoundError:
...   print('File not found')
...
It failed
>>>

这里的 FileNotFoundError 语句并没有执行的原因是 OSError 更一般,它可匹配 FileNotFoundError 异常, 于是就是第一个匹配的。 在调试的时候,如果你对某个特定异常的类成层级关系不是很确定, 你可以通过查看该异常的 __mro__ 属性来快速浏览。比如:

>>> FileNotFoundError.__mro__
(<class 'FileNotFoundError'>, <class 'OSError'>, <class 'Exception'>,
 <class 'BaseException'>, <class 'object'>)
>>>

上面列表中任何一个直到 BaseException 的类都能被用于 except 语句。

以上就是Python同时处理多个异常的方法的详细内容,更多关于Python处理异常的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
python如何将两个txt文件内容合并
Oct 18 Python
python 遍历pd.Series的index和value
Nov 26 Python
Python函数参数类型及排序原理总结
Dec 19 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
django 扩展user用户字段inlines方式
Mar 30 Python
浅谈Python 参数与变量
Jun 20 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 Python
pytest实现多进程与多线程运行超好用的插件
Jul 15 Python
Python远程方法调用实现过程解析
Jul 28 #Python
Python 实现一个计时器
Jul 28 #Python
python爬虫要用到的库总结
Jul 28 #Python
Python常用类型转换实现代码实例
Jul 28 #Python
Python 如何创建一个线程池
Jul 28 #Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 #Python
python爬虫用mongodb的理由
Jul 28 #Python
You might like
PHP防盗链的基本思想 防盗链的设置方法
2015/09/25 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
javascript 新浪背投广告实现代码
2009/07/07 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
2015/02/13 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
小程序实现多选框功能
2018/10/30 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
python类参数self使用示例
2014/02/17 Python
Python中遍历列表的方法总结
2019/06/27 Python
Python函数中的可变长参数详解
2019/09/12 Python
python实现LRU热点缓存及原理
2019/10/29 Python
如何获取Python简单for循环索引
2019/11/21 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
如何理解Python中的变量
2020/06/01 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
自我鉴定范文300字
2013/10/01 职场文书
高中军训感言400字
2014/02/24 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
售后服务承诺函格式
2015/01/21 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
python常见的占位符总结及用法
2021/07/02 Python
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python