Насколько я могу судить, оба следующих фрагмента кода будут служить одной и той же цели. Почему наконец
блокирует вообще?
Код A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
Код B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Throwable
...) A Блок finally
гарантирует, что , однако вы выйдете из этого блока (по модулю нескольких способов явного прерывания всего процесса), он будет выполнен. Это важно для детерминированной очистки ресурсов.
finally
ВСЕГДА не выполняется, если только JVM была отключена, наконец
просто предоставляет метод для размещения кода очистки в одном месте.
Было бы слишком утомительно, если бы вам пришлось поместить код очистки в каждый из блоков catch
.
Обратите внимание, что (по крайней мере, в Java, возможно, также и в C #) также возможно иметь блок try
без catch
, но с наконец
. Когда исключение происходит в блоке try
, код в блоке finally
выполняется до того, как исключение будет выброшено выше:
InputStream in = new FileInputStream("somefile.xyz");
try {
somethingThatMightThrowAnException();
}
finally {
// cleanup here
in.close();
}
Потому что вам нужно, чтобы этот код выполнялся независимо от каких-либо исключений, которые могут возникнуть. Например, вам может потребоваться очистить некоторый неуправляемый ресурс (конструкция using компилируется в блок try / finally).
Наконец, всегда выполняется, тогда как ваш код после перехвата не может.
Вы можете захотеть поместить код, который вы хотите в любом случае запустить, независимо от того, что происходит в вашем блоке 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();
}
Бывают случаи, когда вы хотите выполнить часть кода, несмотря ни на что. Независимо от того, выбрасывается ли исключение. Затем используется , наконец,
.