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:
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:
- Es wird zunächst versucht, einen Block von Code auszuführen, der eine
ValueError
-Ausnahme auslöst. - Die
ValueError
-Ausnahme wird gefangen und alsoriginal_exception
gespeichert. - Anschließend wird eine
RuntimeError
-Ausnahme ausgelöst, wobei dasfrom 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:
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.