我嘗試編寫一些代碼來捕獲斷開的管道錯誤。代碼應該在Python 2.x和Python 3.x中運行。在Python 2和Python 3中捕獲斷開的管道
在Python 2.xa破裂的管道由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中運行?
看看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