In Visual Basic wird die Ausnahmebehandlung mittels des Blocks Try...Catch...Finally umgesetzt. Um eine Ausnahme nach ihrer Abfangung weiterzugeben – d.h. sie durch den Aufrufstapel weiterzuleiten – wird der Operator Throw oder Throw ex verwendet.
Unterschiede:
Throw (ohne Parameter) wirft die aktuelle Ausnahme erneut und bewahrt den ursprünglichen Aufrufstapel (Call Stack).Throw ex wirft das Ausnahmeobjekt, setzt jedoch den Aufrufstapel zurück – die Information über den tatsächlichen Ort, an dem das Problem auftrat, geht verloren.Es wird empfohlen, Throw ohne Parameter für ein korrektes Weiterwerfen von Ausnahmen zu verwenden, wenn sie nicht modifiziert wurden.
Beispiel für korrektes Weiterwerfen:
Try DangerousOperation() Catch ex As Exception ' Protokollierung... Throw ' Aufrufstapel wird bewahrt End Try
Falsche Methode:
Try DangerousOperation() Catch ex As Exception Throw ex ' Aufrufstapel zurückgesetzt, Diagnose erschwert End Try
Was passiert mit dem Aufrufsstapel, wenn Sie Throw ex anstelle von Throw verwenden?
Bei der Verwendung von
Throwohne Parameter bleibt der ursprüngliche Aufrufstapel – der, an dem die Ausnahme aufgetreten ist – erhalten. Bei der Verwendung vonThrow exbeginnt der Stapel mit der aktuellen Zeile, und der ursprüngliche Ort des Auftretens geht verloren. Dies erschwert das Debugging, da Sie nicht sehen, an welchem Teil des Codes das Problem aufgetreten ist.
Geschichte
In einem großen Bankprojekt verwendeten die Entwickler
Throw ex, um logische Fehler auszulösen. Bei der Analyse der Protokolle stellte sich heraus, dass es unmöglich war, den Ort der Ausnahmen zu bestimmen, da die korrekte Nachverfolgung fehlte.
Geschichte
Innerhalb der Datenspeicherschicht wurde
Throwzum Weiterwerfen von SqlException verwendet, aber in einigen Fällen ersetzte das Codeformatierungswerkzeug es automatisch durchThrow ex. Dies störte das System zur automatischen Datenextraktion aus den Protokollen und verlängerte die Reaktionszeit auf Vorfälle.
Geschichte
Der Versuch, das Objekt Exception zu modifizieren und es über
Throwohne Parameter weiterzugeben, führte dazu, dass die Änderungen nicht in den Protokollen widergespiegelt wurden – nur die explizite Erstellung eines neuen Ausnahmeobjekts unter Beibehaltung des ursprünglichen als InnerException half.