Der Code im Block Finally
wird immer ausgeführt. So wird die Sitzung geschlossen, unabhängig davon, ob im Block Catch
eine Ausnahme ausgelöst wird oder nicht. Wie von kem in einem Kommentar vorgeschlagen, sollten Sie versuchen, diesen Code im Debugger einzeln durchzugehen und das genaue Verhalten für sich selbst zu sehen.
Als Randbemerkung, sollten Sie nie throw ex
schreiben, weil das wird den Call-Stack der ursprünglichen Ausnahme von dem Punkt, an dem diese throw-Anweisung ausgeführt wird zurückgesetzt. Das Ergebnis ist, dass Sie relevante Informationen darüber verlieren, wo die Ausnahme tatsächlich aufgetreten ist. Stattdessen sollten Sie einfach throw
verwenden. Alternativ können Sie eine neue Ausnahmeklasse erstellen und InnerException
auf ex
setzen, aber das scheint für Sie nur umsonst zu arbeiten, es sei denn, Sie müssen dem Stack-Trace zusätzliche Informationen hinzufügen.
Natürlich wirft der Code, den Sie oben gezeigt haben, auch die größere Frage auf, warum Sie die Ausnahme überhaupt fangen. Sobald Sie es einfach in throw
die Ausnahme im Block Catch
umgeschrieben haben, ist das die gleiche Sache wie Sie nicht die Ausnahme an erster Stelle fangen. Stattdessen, warum nicht einfach weglassen Catch
Block insgesamt und begleichen nur die Try-Finally
Muster?
public void myFunc()
{
Session session = Hibernate.getSession();
try
{
//do something
}
finally
{
session.Close();
}
}
Und dann, wenn wir festgestellt haben, dass der Code geändert werden kann, die Try-Finally
Muster statt zu implementieren, können wir eine weiter gehen. Warum nicht einfach den ganzen Shebang durch eine using
statement ersetzen, die sich darum kümmert, das Objekt für Sie automatisch zu entsorgen?
der finally-Block wird ausgeführt, auch wenn Sie die Ausnahme vom catch-Block erneut auslösen; In Ihrem Debugger durchgehen. – kem