私は壊れたパイプエラーをキャッチするためにいくつかのコードを書こうとしています。コードはPython 2.xとPython 3.xで動くべきです。壊れたパイプは、現在の構文またBrokenPipeError
Python 2とPython 3で壊れたパイプをキャッチ
BrokenPipeError: [Errno 32] Broken pipe
ある - 壊れたパイプはこれはPython 3.xの中で変更されたsocket.error
socket.error: [Errno 32] Broken pipe
で表されるPythonの2.xaで
例外処理が少し変更されました(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
残りの問題が1つあります:Python 2.xではBrokenPipeError
が存在しないため、例外がある場合はいつでもdo_something()
にPython 2.xが別の例外をスローして、BrokenPipeError
を知らないと不平を言います。 socket.error
はPython 3.xで廃止されているため、近い将来Python 3.xでも同様の問題が発生する可能性があります。
このコードをPython 2.xおよびPython 3.xで実行するにはどうすればよいですか?
http://python-future.org/compatible_idioms.htmlを見ると、例外処理が示されています。 – MKesper
http://newbebweb.blogspot.in/2012/02/python-head-ioerror-errno-32-broken.htmlこちらは –
ありがとうございます!しかし、http://python-future.org/compatible_idioms.html#catching-exceptionsでは、Python 2またはPython 3には存在しないが他のバージョンでは必須の例外をキャッチする方法については説明していません。 – speendo