我尝试编写一些代码来捕获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中运行?
如果您关心的是管道错误,那么您可能想要捕获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()
如果你关心的不仅仅是破损的管道,那么这个答案是恰当的和惯用的.