Seite 1 von 1

Bei Error innerhalb von If nach Else springen

Verfasst: Samstag 27. Juli 2013, 21:26
von JohnDoe
Hallo, zuerst einmal ein wenig Code (Python3):

Code: Alles auswählen

def connect():
    # Parameter, werden eigentlich anders übergeben
    keyFile = None # '~/.ssh/id_rsa'
    host = 'domain.org'
    port = 22
    username = 'user'
    # Die eigentliche Funktion
    transport = paramiko.Transport((host, port))
    sftp = None
    if keyFile is None:
        try:
            transport.connect(username=username, password=getpass.getpass('Password? ')))
        except paramiko.ssh_exception.BadAuthenticationType:
            raise Exception('Set a keyFile!')
    else:
        key = None
        keyFile = os.path.expanduser(keyFile)
        try:
            key = paramiko.RSAKey.from_private_key_file(keyFile)
        except paramiko.ssh_exception.PasswordRequiredException:
            key = paramiko.RSAKey.from_private_key_file(keyFile, password=getpass.getpass('Password? '))
        transport.connect(username=username, pkey=key)
    sftp = paramiko.SFTPClient.from_transport(self.transport)
    return transport, sftp
Da fehlt jetzt ein Großteil (eigentlich die ganze Klasse, allerdings soll das auch nicht Gegenstand meiner Frage sein).

Wenn in der Variable keyFile eine Text steht (zum Beispiel '~/.ssh/id_rsa'), so soll der Login zum Server via PublicKey geschehen, falls nicht wird ein normaler Passwort-Login verwendet.

Angenommen der Nutzer lässt None in der Variable keyFile stehen und es tritt eine paramiko.ssh_exception.BadAuthenticationType-Exception auf, weil der Server nur PublicKey zulässt: Ist es möglich, in den else-Teil zu springen und es mittels PublicKey zu probieren?

Falls keyFile None ist kann man im else-Teil ja den Wert auf '~/.ssh/id_rsa' setzen. Natürlich könnte man auch innerhalb der Exception den ganzen Code nochmals schreiben, aber ich habe nie zweimal denselben Code in einem Programm.

Und ja, man könnte auch eine weitere Funktion connetFromKeyFile() oder ähnliches definieren, meine Frage ist aber ob es möglich ist aus der Exception direkt in den else-Teil zu springen. Würde mich mal interessieren.

mfg

Re: Bei Error innerhalb von If nach Else springen

Verfasst: Samstag 27. Juli 2013, 22:03
von Hyperion
JohnDoe hat geschrieben: Ist es möglich, in den else-Teil zu springen und es mittels PublicKey zu probieren?
Ein Glück nicht - wie sollte man das auch formulieren?
JohnDoe hat geschrieben: Natürlich könnte man auch innerhalb der Exception den ganzen Code nochmals schreiben, aber ich habe nie zweimal denselben Code in einem Programm.

Und ja, man könnte auch eine weitere Funktion connetFromKeyFile()...
Du hast des Rätsels Lösung also bereit selber gefunden ;-)

Im übrigen ist Deine ``connect``-Methode jetzt schon zu lang. Du solltest da viel mehr in separate Methoden auslagern. Und die Magic Numbers ``host``, ``post`` und ``username`` haben nichts in der Methode verloren. So etwas solltest Du auf Objekt-, Klassen- oder gar Modulebene definieren.

Re: Bei Error innerhalb von If nach Else springen

Verfasst: Sonntag 28. Juli 2013, 00:39
von JohnDoe
Hyperion hat geschrieben: Ein Glück nicht - wie sollte man das auch formulieren?
Versprich mir, mich nicht zu steinigen: Goto :D

`goto` hat darum einen schlechten Ruf, weil es den Kontrollfluss undurchsichtig macht.[*] In deinem Fall solltest du einfach das eine `if` in 2 sequentielle aufbrechen.

[*] Was nicht ganz stimmt, richtig angewendet kann das durchaus sinnvoll sein, Djikstras beruechtigtes Paper stammt aus einer Zeit in der strukturelle Gotos wie `if`, Schleifen und Funktionen noch nicht allgegenwaertig waren.

Re: Bei Error innerhalb von If nach Else springen

Verfasst: Sonntag 28. Juli 2013, 00:48
von cofi
JohnDoe hat geschrieben:
Hyperion hat geschrieben: Ein Glück nicht - wie sollte man das auch formulieren?
Versprich mir, mich nicht zu steinigen: Goto :D
`goto` hat darum einen schlechten Ruf, weil es den Kontrollfluss undurchsichtig macht.[*] In deinem Fall solltest du einfach das eine `if` in 2 sequentielle aufbrechen.

[*] Was nicht ganz stimmt, richtig angewendet kann das durchaus sinnvoll sein, Djikstras beruechtigtes Paper stammt aus einer Zeit in der strukturelle Gotos wie `if`, Schleifen und Funktionen noch nicht allgegenwaertig waren.

Re: Bei Error innerhalb von If nach Else springen

Verfasst: Sonntag 28. Juli 2013, 02:33
von JohnDoe
Und ich dachte Überwachung wär mein größtes Problem, aber nein, jetzt werden meine Beiträge schon im Python-Forum verändert...

Ernsthaft: Wer hat meinen obigen Beitrag verändert? Das hab ich so definitiv nicht geschrieben.

@Hyperion: In meinem eigentlich obigen Beitrag habe ich noch gefragt, warum meine Connect-Methode zu lang ist. Die Deklaration der Parameter ist natürlich in meiner eigentlichen Klasse anders bewerkstelligt, aber was an Code übrig bleibt ist doch so optimal, oder nicht? Sind eh nur eine handvoll Zeilen Code.

Anders gefragt: Inwiefern würdest du die Funktion abändern?

mfg

Re: Bei Error innerhalb von If nach Else springen

Verfasst: Sonntag 28. Juli 2013, 03:03
von cofi
JohnDoe hat geschrieben:Und ich dachte Überwachung wär mein größtes Problem, aber nein, jetzt werden meine Beiträge schon im Python-Forum verändert...

Ernsthaft: Wer hat meinen obigen Beitrag verändert? Das hab ich so definitiv nicht geschrieben.
Entschuldige, das war wohl ich. Der Edit-Button war wohl groesser als der Quote-Button ... und ich hab mich schon gefragt warum meine Antwort nicht angezeigt wurde.

Re: Bei Error innerhalb von If nach Else springen

Verfasst: Dienstag 30. Juli 2013, 14:10
von JohnDoe
cofi hat geschrieben:Entschuldige, das war wohl ich. Der Edit-Button war wohl groesser als der Quote-Button ... und ich hab mich schon gefragt warum meine Antwort nicht angezeigt wurde.
Ah, ok. Hatte erst gedacht das wäre eventuell Absicht gewesen (ich bin nicht paranoid, nur Realist ;) )

mfg