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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
python使用Berkeley DB数据库实例
Sep 26 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
python集合常见运算案例解析
Oct 17 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
python3的pip路径在哪
Jun 23 Python
python实现邮件循环自动发件功能
Sep 11 Python
python编写函数注意事项总结
Mar 29 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 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 结果集的分页实现代码
2009/03/10 PHP
PHP教程 变量定义
2009/10/23 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python获取央视节目单的实现代码
2015/07/25 Python
使用python实现ANN
2017/12/20 Python
Python中常用的8种字符串操作方法
2019/05/06 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
为什么称python为胶水语言
2020/06/16 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
师德学习感言
2014/01/31 职场文书
高校教师岗位职责
2014/03/18 职场文书
青春励志演讲稿
2014/04/29 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
springmvc直接不经过controller访问WEB-INF中的页面问题
2022/02/24 Java/Android