web-dev-qa-db-ja.com

これをキャッチする方法Python例外:エラー:[Errno 10054]既存の接続がリモートホストによって強制的に閉じられました

Python 2.7)でこの特定の例外(およびこの例外のみ)をキャッチしようとしていますが、例外クラスに関するドキュメントが見つからないようです。何かありますか?

[Errno 10054] An existing connection was forcibly closed by the remote Host

これまでの私のコード:

try:
  # Deleting filename
  self.ftp.delete(filename)
  return True
except (error_reply, error_perm, error_temp):
  return False
except # ?? What goes here for Errno 10054 ??
  reconnect()
  retry_action()
13
SilentSteel

エラータイプはsocket.errorで、ドキュメントは here です。次のようにコードを変更してみてください:

import socket
import errno  

try:
    Deleting filename
    self.ftp.delete(filename)
    return True
except (error_reply, error_perm, error_temp):
    return False
except socket.error as error:
    if error.errno == errno.WSAECONNRESET:
        reconnect()
        retry_action()
    else:
        raise
14
user2489743

例外をフィルタリングする場合、最初のステップは、例外のタイプを特定し、except句に追加することです。 pythonはトレースバックの一部として出力するので、通常は簡単です。タイプについては言及しませんが、socket.gaierrorのように見えるので、それで進めます。

次のステップは、例外の中で何が興味深いかを理解することです。この場合、 `help(socket.gaierror) 'がトリックを実行します。errnoというフィールドがあり、どのエラーをフィルター処理するかを判別するために使用できます。

次に、コードを再配置して、例外が再試行ループ内でキャッチされるようにします。

import socket

retry_count = 5  # this is configured somewhere

for retries in range(retry_count):
    try:
        # Deleting filename
        self.ftp.delete(filename)
        return True
    except (error_reply, error_perm, error_temp):
        return False
    except socket.gaierror, e:
        if e.errno != 10054:
            return False
        reconnect()
return False
1
tdelaney

あなたは次のようなことを試みるかもしれません:

try:
    # Deleting filename
    self.ftp.delete(filename)
    return True
except (error_reply, error_perm, error_temp):
    return False
except Exception, e:
    print type(e)  # Should give you the exception type
    reconnect()
    retry_action()
1
giovanni