Frage

Was ist der Unterschied zwischen

try {
    fooBar();
} finally {
    barFoo();
}

und

try {
  fooBar();
} catch(Throwable throwable) {
    barFoo(throwable); // Does something with throwable, logs it, or handles it.
}

Ich mag die zweite Version besser, weil es gibt mir Zugang zum Throwable. Gibt es eine logische Differenz oder eine bevorzugte Konvention zwischen den beiden Varianten?

Außerdem gibt es eine Möglichkeit, die Ausnahme von der finally zugreifen?

War es hilfreich?

Lösung

Das sind zwei verschiedene Dinge:

  • Der catch-Block wird nur dann ausgeführt, wenn eine Ausnahme im try-Block geworfen wird.
  • Der finally-Block wird ausgeführt, immer nach dem Versuch (-catch) Block, wenn eine Ausnahme ausgelöst wird oder nicht.

In Ihrem Beispiel Sie haben nicht das dritte mögliche Konstrukt gezeigt:

try {
    // try to execute this statements...
}
catch( SpecificException e ) {
    // if a specific exception was thrown, handle it here
}
// ... more catches for specific exceptions can come here
catch( Exception e ) {
    // if a more general exception was thrown, handle it here
}
finally {
    // here you can clean things up afterwards
}

Und wie @codeca in seinem Kommentar sagt, gibt es keine Möglichkeit, die Ausnahme innerhalb der finally-Block zuzugreifen, weil der finally-Block ausgeführt wird, auch wenn es keine Ausnahme.

Natürlich können Sie eine Variable deklarieren, die die Ausnahme außerhalb des Blocks hält und einen Wert innerhalb des catch-Block zuweisen. Danach können Sie diese Variable zugreifen in Ihrem finally-Block.

Throwable throwable = null;
try {
    // do some stuff
}
catch( Throwable e ) {
    throwable = e;
}
finally {
    if( throwable != null ) {
        // handle it
    }
}

Andere Tipps

Das sind keine Variationen, sie sind grundsätzlich verschiedene Dinge. finally ausgeführt immer , catch nur dann, wenn eine Ausnahme auftritt.

Schließlich und Catch-Blöcke sind ganz anders:

  • Im catch-Block Sie auf die ausgelöste Ausnahme reagieren können. Dieser Block wird nur dann ausgeführt, wenn es eine nicht behandelte Ausnahme ist und der Typ übereinstimmt, die oder Unterklasse der eines in dem catch-Block des Parameter angegeben wird.
  • wird schließlich immer ausgeführt werden, nachdem try und catch-Blöcke, ob es eine Ausnahme ausgelöst oder nicht.

So

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if ExceptionA 
  // was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in try 
  // and not handled by first catch block
}

unterscheidet sich von

try {
  //some code
}
finally {
  // Gets executed whether or not 
  // an exception was thrown in try block
}

deutlich.

Wenn Sie einen Try-Block definieren müssen Sie definieren

  1. ein finally-Block, oder
  2. ein oder mehr catch-Blöcke, oder
  3. ein oder mehr catch-Blöcke und ein finally-Block

So ist der folgende Code zu gelten:

try {
  //some code
}
catch (ExceptionA) {
  // Only gets executed if 
  // ExceptionA was thrown in try block
}
catch (ExceptionB) {
  // Only executed if ExceptionB was thrown in 
  // try and not handled by first catch block
}
//even more catch blocks
finally {
  // Gets executed whether or not an 
  // exception was thrown in try block
}
try {
    statements;
} catch (exceptionType1 e1) {      // one or multiple
    statements;                 
} catch (exceptionType2 e2) {
    statements;
}    
...
} finally {                                 // one or none
    statements;
}
  1. Alle try-Anweisungen müssen umfassen entweder eine catch-Klausel oder eine finally-Klausel
  2. Es kann eine mehr catch-Klauseln hat aber nur ein finally-Klausel
  3. Während einer Ausführung, wenn Fehler auftreten, dann wird die Steuerung an dem entsprechenden Catch-Block übertragen und führt die Anweisungen und schließlich Block ausgeführt wird.

Egal, was der Finally-Block immer ausgeführt wird, also im Allgemeinen, schließlich Block verwendet wird, wenn Sie Sitzungen haben, Datenbankverbindungen oder Dateien oder Sockets geöffnet sind, dann ist der Code für diese Verbindungen schließen platziert werden. Dies ist nur sicher, dass keine Speicherlecks oder irgendwelche anderen Ausgaben in einer Anwendung machen nicht auftreten sollte.

Schließlich und Catch-Blöcke sind ganz anders:

Im catch-Block können Sie auf die ausgelöste Ausnahme reagieren. Dieser Block wird nur dann ausgeführt, wenn es eine nicht behandelte Ausnahme ist und die Art übereinstimmt, die oder Unterklasse der eines in dem catch-Block des Parameter angegeben wird. Schließlich immer nach Versuch und Catch-Blöcken ausgeführt werden, ob es eine Ausnahme ausgelöst wird oder nicht.

Versuch wird verwendet, um ein Verfahren auszuführen, die eine Ausnahme auslösen können

Fang auf „Fang“ Anschlag verwendet diese Ausnahme

ist schließlich für jede Sanierung verwendet, um von dieser Ausnahme benötigte gefangen oder nicht

try{
    myObject.riskyMethod(); // run a method that may throw an exception
}
catch(Exception ex){
    myLogger.log(ex.Message); // "catch" stop that exception
}
finally{
    myObject = null; // clean up needed from that exception being caught
}

In My Forschung Schließlich Block immer ausgeführt wird, und es ist vor allem „für die alle geöffneten Verbindungen zu schließen verwendet“ und etwas zu zerstören, die unnötig ausgeführt wird.

Schließlich Block wird immer ausgeführt. Catch-Block wird nur dann ausgeführt, wenn eine Ausnahme, die die Blöcke übereinstimmt Parameter catched wird.

Auch in der ersten Form könnte man es in dem Aufruf der Methode loggt sein. Also gibt es keinen großen Vorteil, wenn Sie genau dort einige spezielle Handhabung machen wollen.

Im Allgemeinen, wenn wir alle Ressourcen wie Ströme verwenden, Verbindungen etc .. wir haben sie explizit schließen schließlich blockieren verwenden. Im Programm unten angegeben wir Daten aus einer Datei mit Filereader lesen und wir schließen mit schließlich blockieren.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]){
      FileReader fr=null;       
      try{
         File file=new File("file.txt");
         fr = new FileReader(file);  char [] a = new char[50];
         fr.read(a); // reads the content to the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }
       finally{ 
          try{
              fr.close();
          }catch(IOException ex){       
               ex.printStackTrace();
           }
       }
    }

}

Vielleicht andere Leute wie ich für so etwas gesucht.

Informationen auf dieser Seite tutpoint

Try-Block werden die Anweisungen halten, die zu heben Ausnahme werden. Der Fang Block wird die aus dem Try-Block geworfen Referenz halten und die erforderlichen Meldungen werden von catch-Block erzeugt. Schließlich wird der Block auch die verwendeten Ressourcen wie io Schließen Datei Schließen dB Schließen schließen verwendet .. In Java -9 verbesserte Anprobe mit Ressourcen kam, wo die Ressourcen außerhalb des deklarierten try..in enchanced mit Ressource versuchen, den catch-Block ist obligatorisch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top