Разница между попробовать, наконец и попробовать

StackOverflow https://stackoverflow.com/questions/2854910

  •  27-09-2019
  •  | 
  •  

Вопрос

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

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

и

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

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

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

Это было полезно?

Решение

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

  • Блок Catch выполнен только в том случае, если исключение брошено в блок TRY.
  • Блок наконец выполнен всегда после блока 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 говорит в его комментарии, нет способа доступа к исключительному исключительству внутри блока наконец-то, потому что блок наконец выполнен, даже если нет исключения.

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

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

Другие советы

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

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

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

Так

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
}

существенно.

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

  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
}
try {
    statements;
} catch (exceptionType1 e1) {      // one or multiple
    statements;                 
} catch (exceptionType2 e2) {
    statements;
}    
...
} finally {                                 // one or none
    statements;
}
  1. Все заявления PRORMENT должны включать один слов или предложение о последнее время
  2. У него могут быть несколько пунктов ловли, но только одна оговорка, наконец
  3. Во время любого выполнения, если возникают какие-либо ошибки, то управление переносится на соответствующую блоку Catch и выполняет операторы, и выполняется, и, наконец, заблокируется.

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

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

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

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

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

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

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
}

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

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

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

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

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

}

Может быть, другие парни, как я искал что-то подобное.

Информация с этой страницы окулина

Попробуйте блок проведет утверждения, которые собираются поднять исключение. Блок Catch будет удерживать ссылку, выбрасывающую из блока TRY, и требуемые сообщения генерируются из блока Catch. Наконец-то блок также используется для закрытия используемых ресурсов, таких как закрытие IO, закрытие файлов, закрытие DB .. В Java -9 Enhanced Try-Create Resource придумал, где ресурсы объявлены вне попытки. является обязательным

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top