Try Repeat

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
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hallo Leute,


Ich wollte mal Fragen ob diese Funktion so ok ist ( Ich möchte in der Praxis oft das nach einer Exception etwas nochmal probiert wird ):

Oder hat jemand eine bessere Variante?

Code: Alles auswählen

def openfile(versuche):
    while True:
        try:
            with open("test.txt", "r") as outfile:
                inhalt = outfile.read()
        except FileNotFoundError:
            versuche -= 1
            print(f"File konne nicht geöffnet werden es wird noch {versuche} mal versucht")
            if versuche == 0:
                raise
        else:
            return inhalt



def main():
    inhalt = openfile(versuche=2)
    print(inhalt)


if __name__ == "__main__":
    main()

NACHTRAG es geht mehr um die try except behandlung so macht es natürlich meistens kein Sinn zweimal eine Datei öffnen zu wollen , bei der es vorher nicht funktioniert hat
Eine Vision ohne Aktion bleibe eine Illusion
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bl3nder: Könnte man so machen.

Der Name `outfile` für eine Datei aus der *gelesen* wird, ist allerdings recht ungünstig gewählt. 😉
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Bl3nder,

Ein klassischer Anwendungsfall währe die Validierung einer Benutzereingabe. Dabei würde ich die Anzahl der Vesuche aber nicht limitieren, sondern dem Benutzer selbst die Möglichkeit geben, den Vorgang abzubrechen.
Bei anderen Fällen ist es fraglich...

Es kommt darauf an wie hoch die Wahrscheinlichkeit ist, dass die Operation bei einem weiteren Versuch erfolgreich ist. Aber was währe das?
Selbst wenn du in schneller Folge 1000 mal prüfst, geht das ja so schnell, dass sich in kurzer Zeit kaum etwas ändern wird.
Wenn du es länger versuchst, oder z.B. sogar ein sleep einbaust, blockiert die Applikation an dieser Stelle, was meistens keine gute Idee ist.

Besser währe es daher in zeitlichen Abständen wiederholt etwas zu "versuchen", dann aber nur jeweils einmal. Wenn es fehlschlägt, kann die Appliktion dann zwischenzeitlich etwas anderes machen um es dann später wieder nur einmal zu "versuchen".

Ich würder daher außer bei der Benutzereingabe kaum einen Anwendungsfall für so etwas sehen.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

@ __blackjack__,
stimmt outputfile ist wirklich nicht der beste Namen dafür :D , wird geändert.



@rogerb,

prinzipiell hast du vollkommen recht in diesem Beispiel ging es mir aber nur darum ob man so eine Art Try Repeat funktion umsetzen kann wie schon erwähnt ist die Fehlerbehandlung auch quatsch wie oben geschrieben man wartet nicht oder versucht die datei zu schließen oder auf eine Eingabe zu reagieren mir ging es mehr um das Konstrukt jedoch danke Ich dir für deine Anmerkung.
Eine Vision ohne Aktion bleibe eine Illusion
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Bl3nder,

nur um es nochmal klar zu stellen. Ich hatte mich nicht auf das Beispiel bezogen.
Generell ist es meiner Meinung nach keine gute Idee eine Operation bei einem Fehler zu wiederholen.
Es sei denn es gibt eine hinreichend große Wahrscheinlichkeit, dass sich beim zweiten oder dritten Versuch etwas ändert.
Außer einer Benutzereingabe, fällt mir da aber nichts ein.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

@rogerb da gibt's durchaus Dinge, wie zB interne Services (Micro oder nicht so Micro), die aufgrund zB von starker Last auch mal nicht antworten koennen. Zusammen mit einem progressiven Abstandhalten kann man so durchaus ein paar mal einen Versuch unternehmen, bis man den Fehler erst nach oben durchlaesst. Oder meintest du das mit 'kann was anderes machen?' - denn das wiederum ist eher ungewoehnlich, das man etwas tut, und eine bestimmte Information erst spaeter nochmal "beimengt".
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

... die aufgrund zB von starker Last auch mal nicht antworten koennen ...
Ja, das kann ein Anwendungsfall sein, denn diese Spitzen währen ja im besten Fall nach kurzer Zeit wieder abgebaut. Oder es würder nach einer vertretbaren Zeit eine berechtigte Fehlermeldung geben.
Antworten