Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 415 – Implementierung der Unterdrückung des Ausnahme-Kontexts mit Ausnahmeattributen

Autor:
Benjamin Peterson <benjamin at python.org>
BDFL-Delegate:
Alyssa Coghlan
Status:
Final
Typ:
Standards Track
Erstellt:
26-Feb-2012
Python-Version:
3.3
Post-History:
26-Feb-2012
Ersetzt:
409
Resolution:
Python-Dev Nachricht

Inhaltsverzeichnis

Zusammenfassung

PEP 409 führte die Unterstützung für die Konstruktion raise exc from None ein, um die explizite Unterdrückung der Anzeige des Ausnahme-Kontexts zu ermöglichen. Diese PEP behält die sprachlichen Änderungen bei, die bereits in PEP 409 implementiert wurden, ersetzt jedoch den zugrunde liegenden Implementierungsmechanismus durch einen einfacheren Ansatz, der auf einem neuen Attribut __suppress_context__ für alle BaseException-Instanzen basiert.

PEP-Akzeptanz

Diese PEP wurde von Alyssa Coghlan am 14. Mai 2012 angenommen.

Begründung

PEP 409 ändert __cause__ standardmäßig zu Ellipsis. Wenn dann __cause__ durch raise exc from None auf None gesetzt wird, wird kein Kontext oder keine Ursache ausgegeben, falls die Ausnahme nicht abgefangen wird.

Das Hauptproblem bei diesem Schema ist, dass es die Rolle von __cause__ verkompliziert. __cause__ sollte die Ursache der Ausnahme angeben, nicht ob __context__ ausgegeben werden soll oder nicht. Diese Verwendung von __cause__ ist auch in Zukunft nicht einfach erweiterbar. Wir könnten zum Beispiel eines Tages möchten, dass der Programmierer auswählen kann, welcher der beiden ( __context__ und __cause__) ausgegeben werden soll. Die Implementierung von PEP 409 ist dafür nicht geeignet.

Die Verwendung von Ellipsis ist ein Hack. Vor PEP 409 wurde Ellipsis ausschließlich in der erweiterten Slicing-Syntax verwendet. Erweiterte Slicing-Syntax hat nichts mit Ausnahmen zu tun, daher ist es für jemanden, der ein Ausnahmeobjekt inspiziert, nicht klar, warum __cause__ auf Ellipsis gesetzt werden sollte. Die Standardverwendung von Ellipsis für __cause__ macht es asymmetrisch zu __context__.

Vorschlag

Ein neues Attribut für BaseException, __suppress_context__, wird eingeführt. Immer wenn __cause__ gesetzt wird, wird __suppress_context__ auf True gesetzt. Insbesondere wird die Syntax raise exc from cause exc.__suppress_context__ auf True setzen. Der Code, der Ausnahmen ausgibt, prüft dieses Attribut, um festzustellen, ob Kontext und Ursache ausgegeben werden sollen. __cause__ kehrt zu seinem ursprünglichen Zweck und seinen ursprünglichen Werten zurück.

Es gibt Präzedenzfälle für __suppress_context__ mit dem Ausnahmeattribut print_line_and_file.

Zusammenfassend lässt sich sagen, dass raise exc from cause äquivalent sein wird zu

exc.__cause__ = cause
raise exc

wobei exc.__cause__ = cause implizit exc.__suppress_context__ setzt.

Patches

Es gibt einen Patch zu Issue 14133.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0415.rst

Letzte Änderung: 2025-02-01 08:59:27 GMT