Ein Kollege von mir hat diesen (vereinfachten) Code versehentlich eingegeben und sich gefragt, warum seine Ausnahme nicht erwischt wurde:
%Vor% Jetzt weiß ich, dass die korrekte Syntax zum Abfangen beider Ausnahmearten except (IndexError, ValueError):
sein sollte, aber warum gilt die obige gültige Syntax? Und wie funktioniert es?
Zum Beispiel wird der obige Code ValueError
werfen und nicht gefangen werden. Aber nimm diesen Code:
Der IndexError
wird gefangen. Wie wird das or
ausgewertet und worauf wird es ausgewertet?!
Danke für jedes Licht, das du vergiessen kannst!
Das liegt daran, dass IndexError or ValueError
auf IndexError
ausgewertet wird.
Der Operator or
gibt den ersten Ausdruck zurück, der als True
(in diesem Fall IndexError
) ausgewertet wird, oder den letzten Ausdruck, wenn keiner von ihnen True
ist.
Ihre except-Anweisung entspricht also tatsächlich:
Das Ergebnis der booleschen Operationen or
und and
ist immer einer der Operanden. Daher wird foo or bar
auf foo
ausgewertet, wenn foo
truthy oder bar
if foo
if falsy.
In diesem Fall sind sowohl IndexError
als auch ValueError
truthy, also wird IndexError or ValueError
zu IndexError
ausgewertet, und Ihre except-Anweisung entspricht except IndexError
.