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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
在Python的web框架中编写创建日志的程序的教程
Apr 30 Python
Python Property属性的2种用法
Jun 21 Python
简介Python的collections模块中defaultdict类型的用法
Jul 07 Python
Python中对象的引用与复制代码示例
Dec 04 Python
Python人脸识别初探
Dec 21 Python
使用requests库制作Python爬虫
Mar 25 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 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 fopen函数用法实例讲解
2019/02/15 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
xml和web特殊字符
2009/04/28 Javascript
jQuery的三种$()
2009/12/30 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
电子商务网站上的常用的js放大镜效果
2011/12/08 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
Python基于动态规划算法计算单词距离
2015/07/25 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
python实现拼接图片
2020/03/23 Python
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
施工资料员的岗位职责
2013/12/22 职场文书
新领导上任欢迎词
2014/01/13 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
全新239军机修复记
2022/04/05 无线电
vue elementUI表格控制对应列
2022/04/13 Vue.js
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android