Разница между попыткой наконец и попыткой поймать - PullRequest
80 голосов
/ 18 мая 2010

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

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

и

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

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

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

Ответы [ 10 ]

112 голосов
/ 18 мая 2010

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

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

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

7 голосов
/ 18 мая 2010

Наконец-то и блоки catch совсем разные:

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

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
}

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

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

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

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

  1. один последний блок или
  2. один или несколько блоков улова или
  3. один или несколько блоков захвата и один, наконец, блок

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

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 голосов
/ 11 февраля 2016

Наконец-то и блоки catch совсем разные:

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

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

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

4 голосов
/ 18 мая 2010

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

catch используется, чтобы «поймать» остановку этого исключения

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

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
}
3 голосов
/ 14 октября 2015

В My reasearch Наконец, блок всегда выполняется, и он в основном «используется для закрытия любых открытых соединений» и для уничтожения чего-то, что работает без необходимости.

2 голосов
/ 12 сентября 2016

Обычно, когда мы используем любые ресурсы, такие как потоки, соединения и т. Д., Мы должны явно закрывать их, используя блок finally. В приведенной ниже программе мы читаем данные из файла с использованием 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

2 голосов
/ 27 августа 2010

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

2 голосов
/ 18 мая 2010

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

...