web-dev-qa-db-fra.com

comment continuer boucle après exception?

J'ai un code où im boucle en passant par la liste des hôtes et en ajoutant des connexions à la liste des connexions, s'il y a une erreur de connexion, je veux l'ignorer et continuer avec l'hôte suivant dans la liste des hôtes.

Heres ce que j'ai maintenant:

def do_connect(self):
    """Connect to all hosts in the hosts list"""
    for Host in self.hosts:
        try:
            client = paramiko.SSHClient()
            client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
            client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], timeout=2)
        except:
            pass
            #client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], password=Host['passwd'])

        finally:
            if paramiko.SSHException():
                pass
            else:
                self.connections.append(client)

Cela ne fonctionne pas correctement. Si la connexion échoue, elle boucle le même hôte encore et encore, jusqu'à ce qu'elle établisse la connexion. Comment puis-je résoudre ce problème?

3
Nanoni

Votre propre réponse est toujours fausse sur plusieurs points ...

import logging
logger = logging.getLogger(__name__)

def do_connect(self):
    """Connect to all hosts in the hosts list"""
    for Host in self.hosts:
        # this one has to go outside the try/except block
        # else `client` might not be defined.
        client = paramiko.SSHClient()
        try:
            client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
            client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], timeout=2)

        # you only want to catch specific exceptions here
        except paramiko.SSHException as e:
            # this will log the full error message and traceback
            logger.exception("failed to connect to %(ip)s:%(port)s (user %(user)s)", Host) 

            continue
        # here you want a `else` clause not a `finally`
        # (`finally` is _always_ executed)
        else:
            self.connections.append(client)
1

Ok, ça a fonctionné, je devais ajouter le Continuer, mentionné par Mark et aussi le précédent, si la vérification à l'intérieur finissait toujours par devenir vraie, ce qui a été corrigé également.

Voici le code corrigé, qui n’ajoute pas les connexions en échec et continue normalement après cela:

def do_connect(self):
    """Connect to all hosts in the hosts list"""
    for Host in self.hosts:
        try:
            client = paramiko.SSHClient()
            client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
            client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], timeout=2)
        except:
            continue
            #client.connect(Host['ip'], port=int(Host['port']), username=Host['user'], password=Host['passwd'])

        finally:
            if client._agent is None:
                pass
            else:
                self.connections.append(client)
0
Nanoni