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解析中国天气网的天气数据
Mar 21 Python
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
Python实现登录接口的示例代码
Jul 21 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
用python计算文件的MD5值
Dec 23 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
php下使用SMTP发邮件的代码
2008/01/10 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
PHP与以太坊交互详解
2018/08/24 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
vue实现简单加法计算器
2020/10/22 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
python处理PHP数组文本文件实例
2014/09/18 Python
python中实现php的var_dump函数功能
2015/01/21 Python
详解Python的单元测试
2015/04/28 Python
Python中模块string.py详解
2017/03/12 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python实现的config文件读写功能示例
2019/09/24 Python
python yield关键词案例测试
2019/10/15 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
单位实习证明怎么写
2014/01/17 职场文书
团日活动总结书格式
2014/05/08 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
房屋租房协议书范本
2014/12/04 职场文书
关于感谢信的范文
2015/01/23 职场文书
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers