Kann ich feststellen, ob eine Ausnahme aufgetreten ist, bevor ich einen Endsperrcode eingegeben habe?

Gibt es in Java eine elegante Möglichkeit, um zu erkennen, ob vor dem Ausführen des finally-Blocks eine Ausnahme aufgetreten ist? Wenn es sich um "close ()" - Anweisungen handelt, ist es üblich, Ausnahmebehandlung innerhalb des finally-Blocks zu benötigen. Idealerweise möchten wir beide Ausnahmen beibehalten und weitergeben (da beide nützliche Informationen enthalten können). Die einzige Möglichkeit, die mir in den Sinn kommt, besteht darin, eine Variable außerhalb des Bereichs "try-catch-finally" zu haben, um einen Verweis auf eine ausgelöste Ausnahme zu speichern. Übertragen Sie dann die "gespeicherte" Ausnahme mit jeder Ausnahme, die im finally-Block auftritt.

Gibt es eine elegantere Art, dies zu tun? Vielleicht ein API-Aufruf, der dies aufdeckt?

Hier ist ein grober Code für das, wovon ich spreche:

Throwable t = null; 
try {   
   stream.write(buffer); 
} catch(IOException e) {
    t = e;   //Need to save this exception for finally
    throw e;
} finally {   
    try {
       stream.close();   //may throw exception
   } catch(IOException e) {
      //Is there something better than saving the exception from the exception block?
      if(t!=null) {
         //propagate the read exception as the "cause"--not great, but you see what I mean.
         throw new IOException("Could not close in finally block: " + e.getMessage(),t);
      } else {
         throw e;  //just pass it up
      }    
   }//end close
}

Offensichtlich gibt es eine Reihe anderer ähnlicher Kludges, bei denen die Ausnahme als Member-Variable gespeichert, von einer Methode zurückgegeben usw. werden kann, aber ich suche nach etwas Eleganterem.

Vielleicht sowasThread.getPendingException() oder etwas ähnliches? Gibt es eine elegante Lösung für andere Sprachen?

Diese Frage ergab sich tatsächlich aus den Kommentaren ineine andere Frage das warf eine interessante Frage auf.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage