Bei Error innerhalb von If nach Else springen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
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
Zuletzt geändert von JohnDoe am Sonntag 28. Juli 2013, 00:35, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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
Antworten