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字符编码
Jan 23 Python
python的re正则表达式实例代码
Jan 24 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
Python 加密与解密小结
Dec 06 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
python异步Web框架sanic的实现
Apr 27 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 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下使用无限生命期Session的方法
2007/03/16 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
JavaScript错误处理
2015/02/03 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
[06:25]第二届DOTA2亚洲邀请赛主赛事第二天比赛集锦.mp4
2017/04/03 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python 搜索大文件的实例代码
2019/07/08 Python
Python线程指南分享
2019/11/19 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
英语专业毕业生自我鉴定
2013/11/09 职场文书
激励口号大全
2014/06/17 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
学校党员干部承诺书
2015/05/04 职场文书
仙境之桥观后感
2015/06/16 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB