Python同时处理多个异常的方法

作者:David Beazley 时间:2021-12-24 11:20:56 

问题

你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢?

解决方案

如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示:


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 语句。

来源:https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p06_handle_multiple_exceptions.html

标签:Python,处理,异常
0
投稿

猜你喜欢

  • thinkphp微信开发(消息加密解密)

    2023-11-21 06:08:43
  • 在Keras中CNN联合LSTM进行分类实例

    2023-10-12 22:07:07
  • python lambda函数及三个常用的高阶函数

    2022-09-25 16:40:58
  • django数据模型on_delete, db_constraint的使用详解

    2023-02-16 04:48:06
  • 编写SQL Server的扩展存储过程实例

    2009-01-20 15:45:00
  • Python中OpenCV Tutorials 20  高动态范围成像的实现步骤

    2022-04-02 07:24:20
  • 使用Tensorboard工具查看Loss损失率

    2022-04-17 12:50:30
  • python opencv 图像拼接的实现方法

    2021-06-21 19:11:51
  • Python爬虫采集Tripadvisor数据案例实现

    2022-01-28 14:54:28
  • Python使用新浪微博API发送微博的例子

    2023-12-22 08:43:45
  • python3利用ctypes传入一个字符串类型的列表方法

    2021-06-10 20:33:36
  • python爬虫之百度API调用方法

    2021-11-18 17:17:13
  • 教你用Python写安卓游戏外挂

    2023-10-21 17:43:29
  • Python 删除List元素的三种方法remove、pop、del

    2021-06-14 20:58:52
  • python自动化测试selenium核心技术三种等待方式详解

    2023-09-16 09:06:04
  • 详解Python prometheus_client使用方式

    2022-01-17 11:09:37
  • python中sys.argv参数用法实例分析

    2021-09-19 20:29:30
  • 深入探究Django中的Session与Cookie

    2023-08-20 23:43:57
  • Python函数进阶与文件操作详情

    2023-09-12 17:24:33
  • OpenCV中VideoCapture类的使用详解

    2022-10-26 18:38:15
  • asp之家 网络编程 m.aspxhome.com