Почему мы используем блоки finally?

Насколько я могу судить, оба следующих фрагмента кода будут служить одной и той же цели. Почему наконец блокирует вообще?

Код A:

try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }

Код B:

try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
82
задан Pops 20 September 2012 в 17:44
поделиться

7 ответов

  • Что произойдет, если возникнет исключение, которое вы не обрабатываете? (Надеюсь, вы не поймаете Throwable ...)
  • Что произойдет, если вы вернетесь изнутри блока try?
  • Что произойдет, если блок catch выдаст исключение?

A Блок finally гарантирует, что , однако вы выйдете из этого блока (по модулю нескольких способов явного прерывания всего процесса), он будет выполнен. Это важно для детерминированной очистки ресурсов.

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

finally ВСЕГДА не выполняется, если только JVM была отключена, наконец просто предоставляет метод для размещения кода очистки в одном месте.

Было бы слишком утомительно, если бы вам пришлось поместить код очистки в каждый из блоков catch .

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

Обратите внимание, что (по крайней мере, в Java, возможно, также и в C #) также возможно иметь блок try без catch , но с наконец . Когда исключение происходит в блоке try , код в блоке finally выполняется до того, как исключение будет выброшено выше:

InputStream in = new FileInputStream("somefile.xyz");
try {
    somethingThatMightThrowAnException();
}
finally {
    // cleanup here
    in.close();
}
11
ответ дан 24 November 2019 в 09:14
поделиться

Потому что вам нужно, чтобы этот код выполнялся независимо от каких-либо исключений, которые могут возникнуть. Например, вам может потребоваться очистить некоторый неуправляемый ресурс (конструкция using компилируется в блок try / finally).

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

Наконец, всегда выполняется, тогда как ваш код после перехвата не может.

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

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

Также, если вы используете несколько catch и хотите поместить некоторый код, общий для всех блоков catch, это место для размещения, но вы не можете быть уверены, что весь код в try был выполнен.

Например:

conn c1 = new connection();
try {
    c1.dosomething();
} catch (ExceptionA exa) {
    handleexA();
    //c1.close();
} catch (ExceptionB exb) {
    handleexB();
    //c1.close();
} finally {
    c1.close();
}
7
ответ дан 24 November 2019 в 09:14
поделиться

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

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

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