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