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使用flask框架操作sqlite3的两种方式
Jan 31 Python
简单实现python数独游戏
Mar 30 Python
python实现微信防撤回神器
Apr 29 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
python实现图像拼接功能
Mar 23 Python
python opencv进行图像拼接
Mar 27 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
关于python3.9安装wordcloud出错的问题及解决办法
Nov 02 Python
python如何用matplotlib创建三维图表
Jan 26 Python
Python基础之进程详解
May 21 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实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
初识Node.js
2015/03/20 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
解析原来浏览器原生支持JS Base64编码解码
2019/08/12 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
python提示No module named images的解决方法
2014/09/29 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python实现密码强度校验
2020/03/18 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
python 如何对logging日志封装
2020/12/02 Python
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
移风易俗倡议书
2014/04/15 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
给上级领导的感谢信
2015/01/22 职场文书
不同意离婚上诉状
2015/05/23 职场文书
关于环保的广播稿
2015/12/17 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL