[英]Catch Broken Pipe in Python 2 AND Python 3
我嘗試編寫一些代碼來捕獲斷管錯誤。 代碼應該在 Python 2.x 和 Python 3.x 中運行。
在 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.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()
如果你關心的不僅僅是破碎的管道,thefourtheye 的回答是恰當和慣用的。
您可以嘗試使用BrokenPipeError
,如果它拋出NameError
,則回socket.error
,就像這樣
import socket
try:
expected_error = BrokenPipeError
except NameError:
expected_error = socket.error
然后像這樣使用它
try:
1 == 2
except expected_error as ex:
# Handle the actual exception here
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.