Zum Inhalt

Ausnahmebehandlung in Python

Generierung eines neuen Ausnahmeobjekts

Um in Python eine neue Ausnahme zu werfen, während die abgefangene Exception im Traceback nachverfolgt werden kann, nutzt man das Schlüsselwort raise in Verbindung mit einem from, um die ursprüngliche Ausnahme anzugeben. Das from-Schlüsselwort erlaubt es Python, sowohl die neue als auch die ursprüngliche Ausnahme im Traceback zu verbinden und auszugeben, was für das Debugging sehr nützlich sein kann.

Hier ist ein Beispiel, wie man das machen kann:

try:
    # Code, der eine Ausnahme auslösen könnte
    raise ValueError("Ein Wertfehler ist aufgetreten")
except ValueError as original_exception:
    # Eine neue Ausnahme werfen und 
    # die ursprüngliche Ausnahme im Traceback behalten
    raise RuntimeError("Ein neuer Fehler") from original_exception
Traceback (most recent call last):
File "***.py", line 3, in <module>
    raise ValueError("Ein Wertfehler ist aufgetreten")
ValueError: Ein Wertfehler ist aufgetreten

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "***.py", line 7, in <module>
    raise RuntimeError("Ein neuer Fehler") from original_exception
RuntimeError: Ein neuer Fehler

In diesem Beispiel:

  1. Es wird zunächst versucht, einen Block von Code auszuführen, der eine ValueError-Ausnahme auslöst.
  2. Die ValueError-Ausnahme wird gefangen und als original_exception gespeichert.
  3. Anschließend wird eine RuntimeError-Ausnahme ausgelöst, wobei das from original_exception angibt, dass die neue Ausnahme direkt aufgrund der ursprünglichen Ausnahme aufgetreten ist.

Wenn dieses Skript ausgeführt wird und die RuntimeError ausgelöst wird, zeigt Python einen Traceback an, der beide Ausnahmen und die Tatsache, dass die zweite Ausnahme aufgrund der ersten ausgelöst wurde, enthält. Dies erleichtert das Verständnis des Kontexts, in dem der Fehler aufgetreten ist.

Der raise/from None-Ausdruck

Der Ausdruck raise new_exception from None in Python wird verwendet, um eine neue Ausnahme zu werfen und dabei explizit die Verkettung mit einer vorherigen Ausnahme zu unterbinden. Das bedeutet, dass im Traceback keine Information über die ursprüngliche Ausnahme erscheinen wird, selbst wenn vorher eine Ausnahme aufgetreten ist.

Hier sind die Schlüsselunterschiede zwischen den Ansätzen:

Verwendung ohne from-Keyword

Wenn Sie einfach raise new_exception innerhalb eines except Blocks verwenden, wird Python implizit die aktuelle Ausnahme als Ursache der neuen Ausnahme betrachten. In modernen Python-Versionen führt dies in der Regel dazu, dass beide Ausnahmen im Traceback erscheinen, wobei Python einen Hinweis gibt, dass eine Ausnahme während der Behandlung einer anderen Ausnahme aufgetreten ist. Dies kann jedoch je nach Python-Version variieren.

Verwendung von raise/from None-Syntax

Dieser Ansatz wird verwendet, wenn Sie eine neue Ausnahme werfen möchten, während Sie explizit vermeiden möchten, dass die vorherige Ausnahme im Traceback erscheint. Indem Sie from None verwenden, teilen Sie Python mit, dass die neue Ausnahme nicht direkt mit einer vorherigen Ausnahme zusammenhängt, wodurch die Traceback-Verkettung unterbrochen wird. Dies ist nützlich, um die Klarheit des Tracebacks zu erhöhen oder wenn die vorherige Ausnahme für den aktuellen Fehlerkontext irrelevant ist.

Ein Beispiel zur Verdeutlichung:

try:
    # Code, der eine Ausnahme auslösen könnte
    raise ValueError("Ein spezifischer Wertfehler")
except ValueError:
    # Eine neue Ausnahme werfen ohne die ursprüngliche
    # Ausnahme im Traceback zu behalten
    raise RuntimeError("Ein neuer, unabhängiger Fehler") from None
Traceback (most recent call last):
File "***.py", line 7, in <module>
    raise RuntimeError("Ein neuer, unabhängiger Fehler") from None
RuntimeError: Ein neuer, unabhängiger Fehler

In diesem Fall zeigt der Traceback ausschließlich die Information über die RuntimeError, ohne Hinweis auf die ursprüngliche ValueError, die aufgetreten ist. Dieser Ansatz gibt Ihnen also eine saubere Möglichkeit, die Fehlerbehandlung zu gestalten, indem Sie gezielt steuern, welche Informationen im Fehler-Traceback erscheinen.