Разница между try-finally и try-catch

Какая разница между

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

и

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

Мне нравится вторая версия лучше, потому что она дает мне доступ к Throwable. Есть ли логическое различие или предпочтительное соглашение между двумя вариантами?

Кроме того, есть ли способ получить доступ к исключению из предложения finally?

Ответ 1

Это две разные вещи:

  • Блок catch выполняется только в том случае, если в блоке try выбрано исключение.
  • Блок finally выполняется всегда после блока try (-catch), если выбрано исключение.

В вашем примере вы не указали третью возможную конструкцию:

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
}

И, как говорит @codeca в своем комментарии, нет способа получить доступ к исключению внутри блока finally, потому что блок finally выполняется, даже если нет исключения.

Конечно, вы можете объявить переменную, которая содержит исключение вне вашего блока и назначить значение внутри блока catch. После этого вы можете получить доступ к этой переменной в своем блоке finally.

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

Ответ 2

Это не вариации, они принципиально разные вещи. finally выполняется всегда, catch только при возникновении исключения.

Ответ 3

Наконец, блоки catch также сильно отличаются:

  • В блоке catch вы можете ответить на вызванное исключение. Этот блок выполняется, только если существует необработанное исключение, и тип соответствует одному или является подклассом того, который указан в параметре блока catch.
  • Наконец, будет выполняться всегда после того, как try и catch блокирует ли возникшее исключение.

Итак,

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
}

отличается от

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

значительно.

Если вы определяете блок try, вы должны определить

  • один блок finally, или
  • один или несколько блоков catch или
  • один или несколько блоков catch и один блок finally

Таким образом, следующий код также будет действительным:

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
}

Ответ 4

try используется для запуска метода, который может генерировать исключение

catch используется для "catch" stop this exception

наконец, используется для любой очистки, необходимой для того, чтобы исключение было поймано или нет

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
}

Ответ 5

try {
    statements;
} catch (exceptionType1 e1) {      // one or multiple
    statements;                 
} catch (exceptionType2 e2) {
    statements;
}    
...
} finally {                                 // one or none
    statements;
}
  • Все операторы try должны включать либо одно предложение catch, либо предложение finally
  • Он может иметь несколько catch-предложений, но только одно предложение finally
  • Во время любого выполнения, если возникают какие-либо ошибки, тогда элемент управления переносится в соответствующий блок Catch и выполняет инструкции и выполняется блок finally.

No Matter, что всегда выполняется блок finally. Итак, в общем случае, блок finally используется, когда у вас есть сеансы, подключения к базам данных или файлы или сокеты открыты, тогда будет помещен код для закрытия этих соединений. Это просто, чтобы убедиться, что в приложении нет утечек памяти или Любые другие проблемы не должны возникать.

Ответ 6

Наконец, блоки catch также сильно отличаются:

В блоке catch вы можете ответить на вызванное исключение. Этот блок выполняется только в том случае, если существует необработанное исключение, а тип соответствует одному или является подклассом, указанным в параметре блока catch. Наконец, будет всегда выполняться после try и catch блоков, если есть исключение, поднятое или нет.

Ответ 7

В моем повторном поиске Блок finally всегда выполняется, и он в основном "используется для любых открытых соединений для закрытия" и уничтожает что-то, что работает без необходимости.

Ответ 8

Наконец, блок всегда выполняется. Блок уловов выполняется только тогда, когда выдается исключение, соответствующее параметру блоков.

Ответ 9

Даже в первой форме вы можете зарегистрировать его в вызывающем методе. Таким образом, нет большого преимущества, если вы не захотите сделать какую-то специальную обработку прямо там.

Ответ 10

Обычно, когда мы используем любые ресурсы, такие как потоки, соединения и т.д., мы должны их явно закрывать, используя, наконец, блок. В приведенной ниже программе мы читаем данные из файла с помощью FileReader, и мы закрываем его, используя блок finally.

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();
           }
       }
    }

}

Возможно, другие ребята вроде меня искали что-то вроде этого.

Информация с этой страницы tutpoint