簡體   English   中英

在 Python 2 和 Python 3 中捕獲損壞的管道

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM