2010-12-30 3 views
0

Also möchte ich eine Bestätigung zu diesem Thema. Ich werde das im Pseudocode erklären.Werfen eine Ausnahme in einem Fangblock mit Ruhezustand vor dem Schließen in endlich

Wenn eine Ausnahme im try-Block ausgelöst wird, wird die Sitzung daher nie geschlossen. Es muss auf das Zeitlimit warten, bevor es geschlossen wird, oder? Wenn ja, gibt es eine bessere Methode, Ausnahmen mit Winterschlaf zu erfassen?

+1

der finally-Block wird ausgeführt, auch wenn Sie die Ausnahme vom catch-Block erneut auslösen; In Ihrem Debugger durchgehen. – kem

Antwort

2

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?

+0

Necro Kommentar :) aber ich möchte darauf hinweisen, dass in Java (C# kann anders sein) 'through ex' nicht tatsächlich' ex' Call Stack neu schreiben. Der Stapel wird zur Entwurfszeit im Ausnahmebedingungsobjekt gespeichert. –