Deaktivieren der Ausnahmeverkettung in Python 3

8

Es gibt ein neues Feature, das in python3 eingeführt wurde - Ausnahmeverkettung. Aus bestimmten Gründen muss ich es für bestimmte Ausnahmen in meinem Code deaktivieren.

Hier ist ein Beispielcode:

%Vor%

was ich sehe:

%Vor%

Was ich sehen möchte:

%Vor%

Ich habe versucht, sys.exc_clear() zu verwenden, aber diese Methode wurde auch aus python 3 entfernt. Ich kann eine Workaround verwenden, die funktioniert

%Vor%

aber ich glaube, dass es eine bessere Lösung gibt.

    
Rugnar 19.11.2015, 16:53
quelle

1 Antwort

12

Einfache Antwort

%Vor%

Sie möchten jedoch wahrscheinlich tatsächlich:

%Vor%

Erklärung

__cause__

Die implizite Ausnahmekette findet über __context__ statt, wenn keine Ausnahmebedingung für eine explizite Ursache vorhanden ist.

Die explizite Ausnahmekette funktioniert über __cause__ . Wenn Sie also __cause__ auf die Ausnahme selbst setzen, sollte die Verkettung gestoppt werden. Wenn __cause__ gesetzt ist, unterdrückt Python die implizite Nachricht.

%Vor%

erhöhen von

Wir können "raise from" verwenden, um dasselbe zu tun:

%Vor%

Keine __cause__

Das Festlegen von __cause__ auf None macht dasselbe:

%Vor%

erhebe von None

Das bringt uns zu dem elegantesten Weg dies zu tun, was von None betrifft:

%Vor%

Aber ich würde argumentieren, dass Sie normalerweise Ihre Ausnahme von der cause-Ausnahme explizit auslösen möchten, damit das Traceback beibehalten wird:

%Vor%

Dies wird uns eine etwas andere Nachricht geben, die besagt, dass die erste Ausnahme die direkte Ursache für die zweite war:

%Vor%     
Trey Hunner 20.11.2015, 09:00
quelle