当前位置:  开发笔记 > 编程语言 > 正文

在Python 2和Python 3中捕获破碎的管道

如何解决《在Python2和Python3中捕获破碎的管道》经验,为你挑选了1个好方法。

我尝试编写一些代码来捕获Broken Pipe Error.代码应该在Python 2.x和Python 3.x中运行.

在Python 2.xa中,断管用a表示 socket.error

socket.error: [Errno 32] Broken pipe

这在Python 3.x中已经改变了 - 现在破损的管道就是了 BrokenPipeError

BrokenPipeError: [Errno 32] Broken pipe

异常处理的语法也有所改变(参见/sf/ask/17360801/),所以我需要做的是:

try:
    do_something()
except BrokenPipeError as e: # implies Python 3.x
    resolve_for_python2()
except socket.error as e:
    if sys.version_info[0] == 2: # this is necessary, as in Python >=3.3
                                 # socket.error is an alias of OSError
                                 # https://docs.python.org/3/library/socket.html#socket.error
        resolve_for_python3()
    else:
        raise

还有(至少)剩下的一个问题:在Python 2.x中没有BrokenPipeError,所以每当Python 2.x中出现异常时do_something()都会抛出另一个异常并抱怨它不知道BrokenPipeError.正如socket.error在Python 3.xa中弃用的那样,在不久的将来,Python 3.x中可能出现类似的问题.

我该怎么做才能使这些代码在Python 2.x和Python 3.x中运行?



1> Thomas Orozc..:

如果您关心的是管道错误,那么您可能想要捕获socket.error并简单地检查它是否确实是管道错误.

您可以使用异常的errno属性来实现,该属性存在于Python 2和Python 3中,这意味着,您不需要不同的Python 2对3逻辑(我认为这样的意图有点清晰):

import socket
import errno


try:
    do_something()
except socket.error as e:
    if e.errno != errno.EPIPE:
        # Not a broken pipe
        raise
    do_something_about_the_broken_pipe()

如果你关心的不仅仅是破损的管道,那么这个答案是恰当的和惯用的.


@speendo在Python标准库本身*中有数十个对`socket.error`的引用。当然,它已经过时了,但是并没有消失。删除`socket.error`将是无意义的重大改变,这是Python核心开发人员公开表示,将来会避免的事情。如果最终还是将其删除(在几十年后!!;)),则错误将很难识别和修复,到那时,您可能将不再支持Python 2。
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有