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数据结构之二叉树的遍历实例
Apr 29 Python
在Python中使用Neo4j数据库的教程
Apr 16 Python
如何将python中的List转化成dictionary
Aug 15 Python
使用python编写udp协议的ping程序方法
Apr 22 Python
对python的输出和输出格式详解
Dec 08 Python
详解用python写一个抽奖程序
May 10 Python
python中dict()的高级用法实现
Nov 13 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 Python
python如何快速生成时间戳
Jul 21 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
python3 re返回形式总结
Nov 20 Python
用Python爬取某乎手机APP数据
Jun 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
Python创建模块及模块导入的方法
2015/05/27 Python
python实现简易云音乐播放器
2018/01/04 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
python如何控制进程或者线程的个数
2020/10/16 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
销售演讲稿范文
2014/01/08 职场文书
教师评优事迹材料
2014/01/10 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
售票员岗位职责
2015/02/15 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
Go语言 详解net的tcp服务
2022/04/14 Golang
python游戏开发Pygame框架
2022/04/22 Python
Golang入门之计时器
2022/05/04 Golang
处理canvas绘制图片模糊问题
2022/05/11 Javascript