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 变量类型及命名规则介绍
Jun 08 Python
Python的垃圾回收机制深入分析
Jul 16 Python
python中常用的九种预处理方法分享
Sep 11 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
解读python logging模块的使用方法
Apr 17 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
Python查找文件中包含中文的行方法
Dec 19 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
利用Python检测URL状态
Jul 31 Python
详解Django中异步任务之django-celery
Nov 05 Python
基于Python采集爬取微信公众号历史数据
Nov 27 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
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
vue实现ToDoList简单实例
2017/02/07 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python list语法学习(带例子)
2013/11/01 Python
Python for循环与getitem的关系详解
2020/01/02 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Python 爬虫的原理
2020/07/30 Python
django教程如何自学
2020/07/31 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
办公室主任岗位职责
2013/11/08 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL