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 30 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
python flask中静态文件的管理方法
Mar 20 Python
Python3标准库总结
Feb 19 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
Python求离散序列导数的示例
Jul 10 Python
Python 3 判断2个字典相同
Aug 06 Python
用python3读取python2的pickle数据方式
Dec 25 Python
基于python3的socket聊天编程
Feb 17 Python
在django中form的label和verbose name的区别说明
May 20 Python
用python制作个视频下载器
Feb 01 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获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
Python中使用动态变量名的方法
2014/05/06 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
python argparser的具体使用
2019/11/10 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
汽车运用工程毕业生自荐信
2013/10/29 职场文书
商业街策划方案
2014/05/31 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
关于python爬虫应用urllib库作用分析
2021/09/04 Python
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis