Различие между попыткой наконец и выгодой попытки

Перейдите в «Управление Jenkins» -> «Консоль скрипта» Введите и выполните команду ниже:

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
82
задан Vijay Kotari 18 May 2010 в 06:15
поделиться

8 ответов

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

  • Блок 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
    }
}
112
ответ дан 24 November 2019 в 09:14
поделиться

Блок попытки будет содержать операторы, которые собираются повысить исключение. Блок выгоды будет содержать ссылку, брошенную от блока попытки, и требуемые сообщения сгенерированы от блока выгоды. Наконец блок также используется для закрытия используемых ресурсов как закрытие io, закрытие файла, закрытие дБ.. В Java подошли-9 улучшенных попыток - с ресурсом, где ресурсы объявляются вне попытки.. в попытке enchanced с ресурсом блок выгоды обязателен

0
ответ дан 24 November 2019 в 09:14
поделиться

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

11
ответ дан 24 November 2019 в 09:14
поделиться

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

2
ответ дан 24 November 2019 в 09:14
поделиться

Блоки finally и catch совершенно разные:

  • В блоке catch вы можете ответить на брошенное исключение. Этот блок выполняется, только если есть необработанное исключение и тип совпадает с типом или является подклассом типа, указанного в параметре блока catch.
  • Finally всегда будет выполняться после блоков 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
}

differs from

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

significantly.

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

  1. один блок finally, или
  2. один или несколько блоков catch, или
  3. один или несколько блоков 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
}
7
ответ дан 24 November 2019 в 09:14
поделиться
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 и выполняет операторы, а блок finally выполняется.

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

4
ответ дан 24 November 2019 в 09:14
поделиться

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
}
4
ответ дан 24 November 2019 в 09:14
поделиться

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

2
ответ дан 24 November 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: