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的Tornado框架的HTTP客户端的教程
Apr 24 Python
Python的Django框架中的Context使用
Jul 15 Python
Python序列操作之进阶篇
Dec 08 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
对python中的装包与解包实例详解
Aug 24 Python
python画图常规设置方式
Mar 05 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
python3.5的包存放的具体路径
Aug 16 Python
Python非单向递归函数如何返回全部结果
Dec 18 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 jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
php中memcache 基本操作实例
2015/05/17 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
php在linux环境中如何使用redis详解
2020/12/15 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
python 多线程实现检测服务器在线情况
2015/11/25 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Django 根据数据模型models创建数据表的实例
2018/05/27 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
python中rb含义理解
2020/06/18 Python
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
土木工程专业自荐信
2013/10/04 职场文书
制冷与电控专业应届生求职信
2013/11/11 职场文书
节约用电标语
2014/06/17 职场文书
2016高考感言
2015/08/01 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技