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 生成目录树及显示文件大小的代码
Jul 23 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
PyTorch中permute的用法详解
Dec 30 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
python time()的实例用法
Nov 03 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
Python中对象的比较操作==和is区别详析
Feb 12 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语言流程控制中的主动与被动
2012/11/05 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
php实现微信支付之现金红包
2018/05/30 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
js性能优化技巧
2015/11/29 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python中实现精确的浮点数运算详解
2017/11/02 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Python requests接口测试实现代码
2020/09/08 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
C有"按引用传递"吗
2016/09/06 面试题
化学系大学生自荐信范文
2014/03/01 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
事业单位岗位说明书
2015/10/08 职场文书
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL