In C # kann ich die throw;
Anweisung verwenden, um eine Ausnahme erneut auszulösen, während die Stapelverfolgung beibehalten wird:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Gibt es so etwas in Java ( das den ursprünglichen Stack-Trace nicht verliert )?
Throwable
s werden nicht durch Werfen verändert. Um den Stack-Trace zu aktualisieren, müssen Sie aufrufenfillInStackTrace()
. Praktischerweise wird diese Methode im Konstruktor von a aufgerufenThrowable
.throw e;
verliert ja die Stapelspur. Aber nicht in Java.Antworten:
wird einfach die Ausnahme erneut auslösen, die Sie abgefangen haben (offensichtlich muss die umgebende Methode dies über ihre Signatur usw. zulassen). Die Ausnahme behält die ursprüngliche Stapelverfolgung bei.
quelle
catch(Exception e) { throw e; }
das nicht behandeln wirst. Wenn Siecatch(InterruptedException ie) { throw ie; }
es wird behandelt. Als Faustregel giltcatch(Exception e)
: Dies ist kein Pokemon, und wir wollen sie nicht alle fangen!Ich würde bevorzugen:
quelle
Exception
in den meisten (aber nicht allen) Fällen normalerweise nicht das Richtige ist .Sie können die Ausnahme auch in eine andere umschließen UND die ursprüngliche Stapelverfolgung beibehalten, indem Sie die Ausnahme als Throwable als Ursachenparameter übergeben:
quelle
throw new YourOwnException("Error while trying to ....", e);
In Java ist fast das gleiche:
quelle
In Java wird nur die Ausnahme ausgelöst, die Sie abgefangen haben,
throw e
und nicht nurthrow
. Java verwaltet den Stack-Trace.quelle
etwas wie das
quelle
Dies ist ein konkretes Beispiel, bei dem die Methode ein löst
IOException
. Dasfinal
Mittelt
kann nur eine Ausnahme enthalten, die vom try-Block ausgelöst wird. Zusätzliches Lesematerial finden Sie hier und hier .quelle
Die Stapelverfolgung wird beibehalten, wenn Sie die abgefangene Vervollständigung in eine andere Ausnahme einschließen (um weitere Informationen bereitzustellen) oder wenn Sie die abgefangene Vervollständigung nur erneut auslösen.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
quelle
Ich hatte gerade eine ähnliche Situation, in der mein Code möglicherweise eine Reihe verschiedener Ausnahmen auslöst, die ich nur neu werfen wollte. Die oben beschriebene Lösung hat bei mir nicht funktioniert, da Eclipse mir mitgeteilt hat, dass dies
throw e;
zu einer nicht gehandelten Ausnahme führt. Deshalb habe ich Folgendes getan:Arbeitete für mich .... :)
quelle