803 Stimmen

Welchen Zweck erfüllt die optionale "else"-Klausel der "try"-Anweisung in Python?

Was ist der Verwendungszweck der optionalen else Klausel des try Aussage?

5 Stimmen

Die meisten Antworten scheinen sich darauf zu konzentrieren, warum wir das Material in der else-Klausel nicht einfach in die try-Klausel selbst einfügen können. Die Frage stackoverflow.com/questions/3996329 fragt ausdrücklich, warum der Code der else-Klausel nicht gehen kann nach der Try-Block selbst, und diese Frage ist mit dieser hier verknüpft, aber ich sehe hier keine klare Antwort auf diese Frage. Ich glaube stackoverflow.com/a/3996378/1503120 beantwortet diese Frage in hervorragender Weise. Ich habe auch versucht, die verschiedenen Bedeutungen der einzelnen Klauseln zu erläutern stackoverflow.com/a/22579805/1503120 .

2 Stimmen

Wenn die Ausnahme nicht auslöst, soll vor der abschließenden Bereinigung etwas geschehen, das nicht selbst die gleiche Ausnahmebehandlung auslösen soll.

5 Stimmen

Nachdem ich vergessen hatte, was else tut in try/else y for/else Ich habe es mehrmals mit dem Begriff noexcept y nobreak in diesen jeweiligen Zusammenhängen. Ich persönlich halte es für eine so unglückliche Überfrachtung des Wortes, dass ich versuche, es nach Möglichkeit zu vermeiden, da es die Leute, die den Code lesen, dazu zwingt, sich zu fragen: "Was macht dieses Ding nochmal?" Normalerweise ist ein Flag, eine continue o break Aussage kann das, was ich ausdrücken will, mit wenigen zusätzlichen Zeilen, aber sicherlich mit mehr Klarheit wiedergeben (wenn die Popularität der Frage ein Hinweis darauf ist).

1voto

Wesley Punkte 10357

Eine else Block kann oft als Ergänzung zu Funktionen dienen, die in jedem except Block.

try:
    test_consistency(valuable_data)
except Except1:
    inconsistency_type = 1
except Except2:
    inconsistency_type = 2
except:
    # Something else is wrong
    raise
else:
    inconsistency_type = 0

"""
Process each individual inconsistency down here instead of
inside the except blocks. Use 0 to mean no inconsistency.
"""

In diesem Fall, inconsistency_type wird in jedem Ausnahmeblock gesetzt, so dass das Verhalten im fehlerfreien Fall ergänzt wird in else .

Ich beschreibe dies natürlich als ein Muster, das eines Tages in Ihrem eigenen Code auftauchen könnte. In diesem speziellen Fall setzen Sie einfach inconsistency_type auf 0 vor der try trotzdem blockieren.

1voto

Nick Punkte 1271

Ich habe gefunden else nützlich für den Umgang mit einer möglicherweise fehlerhaften Konfigurationsdatei:

try:
    value, unit = cfg['lock'].split()
except ValueError:
    msg = 'lock monitoring config must consist of two words separated by white space'
    self.log('warn', msg)
else:
     # get on with lock monitoring if config is ok

Eine Ausnahme beim Lesen der lock config deaktiviert die Sperrüberwachung und ValueErrors protokolliert eine hilfreiche Warnmeldung.

1voto

Gene Punkte 51

Angenommen, Ihre Programmierlogik hängt davon ab, ob ein Wörterbuch einen Eintrag mit einem bestimmten Schlüssel enthält. Sie können das Ergebnis von dict.get(key) mit if... else... konstruieren, oder Sie können es tun:

try:
    val = dic[key]
except KeyError:
    do_some_stuff()
else:
    do_some_stuff_with_val(val)

1voto

NeoWang Punkte 15381

Eines der Anwendungsszenarien, die ich mir vorstellen kann, sind unvorhersehbare Ausnahmen, die umgangen werden können, wenn Sie es erneut versuchen. Zum Beispiel, wenn die Operationen im Try-Block Zufallszahlen beinhalten:

while True:
    try:
        r = random.random()
        some_operation_that_fails_for_specific_r(r)
    except Exception:
        continue
    else:
        break

Wenn die Ausnahme jedoch vorhersehbar ist, sollten Sie immer eine vorherige Validierung einer Ausnahme vorziehen. Allerdings kann nicht alles vorhergesagt werden, so dass dieses Codemuster durchaus seine Berechtigung hat.

1 Stimmen

Sie können dies tun, indem Sie die break innerhalb der try am Ende, was IMO sauberer ist, und man braucht nicht die else . Auch die continue ist nicht wirklich notwendig, Sie können einfach pass .

-19voto

S.Lott Punkte 371691

Le site else: Block ist verwirrend und (fast) nutzlos. Er ist auch Teil des for y while Erklärungen.

Sogar auf einem if -Erklärung, die else: kann auf wirklich schreckliche Weise missbraucht werden, um Fehler zu erzeugen, die sehr schwer zu finden sind.

Bedenken Sie dies.

   if a < 10:
       # condition stated explicitly
   elif a > 10 and b < 10:
       # condition confusing but at least explicit
   else:
       # Exactly what is true here?
       # Can be hard to reason out what condition is true

Überlegen Sie es sich zweimal else: . Es ist im Allgemeinen ein Problem. Vermeiden Sie es, außer in einem if -Statement und erwägen Sie auch dann die Dokumentation der else - Bedingung, um sie explizit zu machen.

6 Stimmen

Dem würde ich nicht zustimmen. Im "if-elif"-Block wird "else" wie "default" im "case"-Block der Sprache C verwendet. Es wird immer empfohlen, den "default"-Fall zu behandeln, auch wenn man denkt, dass man alle Fälle in verschiedenen Bedingungen abgedeckt hat.

1 Stimmen

@Josip: Die Verwendung als "Standard" kann verwirrend sein. Es geht darum, die Bedingung, die diese "Vorgabe" ist, klar zu definieren. Eine schlecht definierte Standardbedingung kann die Hauptursache für fehlerhaftes Verhalten sein. Andernfalls kann sie zu Verwirrung führen. Es sollte in allen Fällen sehr sorgfältig durchdacht werden, nicht nur try, for und while, sondern auch if.

5 Stimmen

Nun, der obige Code ist völlig abstrakt und tut nichts Sinnvolles, also ja - kein Wunder, dass er verwirrend ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X