web-dev-qa-db-fra.com

Comment attraper cette exception Python: erreur: [Errno 10054] Une connexion existante a été fermée de force par l'hôte distant

J'essaie d'attraper cette exception particulière (et seulement cette exception) dans Python 2.7, mais je ne semble pas pouvoir trouver de documentation sur la classe d'exception. Est-ce qu'il y a un?

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

Mon code jusqu'ici:

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

Le type d'erreur est socket.error, la documentation est ici ..__ Essayez de modifier votre code comme ceci:

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

Lorsque vous souhaitez filtrer les exceptions, la première étape consiste à déterminer le type d'exception et à l'ajouter à une clause except. C'est normalement facile, car python l’imprimera dans le cadre d’une trace. Vous ne mentionnez pas le type, mais ça ressemble à socket.gaierror pour moi, alors je vais avec ça.

L'étape suivante consiste à déterminer ce qui est intéressant à l'intérieur de l'exception. Dans ce cas, `help (socket.gaierror) 'fait l'affaire: il existe un champ appelé errno que nous pouvons utiliser pour déterminer les erreurs à filtrer.

Réorganisez maintenant votre code afin que l'exception soit interceptée dans une boucle de nouvelle tentative.

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

Vous pouvez essayer de faire quelque chose comme:

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