gpt4 book ai didi

python - 在 Python 2 和 Python 3 中捕获破损的管道

转载 作者:太空狗 更新时间:2023-10-29 21:33:56 26 4
gpt4 key购买 nike

我尝试编写一些代码来捕捉断管错误。代码应在 Python 2.x 和 Python 3.x 中运行。

在 Python 2.x 中,损坏的管道由 socket.error

表示
socket.error: [Errno 32] Broken pipe

这在 Python 3.x 中已更改 - 破损的管道现在是 BrokenPipeError

BrokenPipeError: [Errno 32] Broken pipe

异常处理的语法也发生了一些变化(参见 https://stackoverflow.com/a/34463112/263589 )所以我需要做的是:

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,所以每当在 do_something() Python 2.x 中出现异常时会抛出另一个异常并提示它不知道 BrokenPipeError。由于 socket.error 在 Python 3.x 中已弃用,因此在不久的将来 Python 3.x 中可能会出现类似的问题。

如何使这段代码在 Python 2.x 和 Python 3.x 中运行?

最佳答案

如果您只关心破损的管道错误,那么您可能想要捕获 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()

如果您确实关心的不仅仅是破损的管道,thefourtheye 的回答是恰当且惯用的。

关于python - 在 Python 2 和 Python 3 中捕获破损的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34718208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com