Наконец, следует использовать все, что нужно сделать, чтобы система работала согласованно. Обычно это означает высвобождение ресурсов
Наконец, всегда выполняется, независимо от того, какое исключение было выброшено. Он должен использоваться для освобождения ресурсов в следующих случаях:
- Завершить соединение
- Закрыть обработчик файла
- Свободная память
- Закрыть соединение с базой данных
Позвольте мне привести полный пример. Представьте, что вы отправляете сообщения через сеть. В псевдокоде:
// With finally | //Without finally
try{ | try{
send_message() | send_message()
} catch(NetworkError){ | } catch(NetworkError){
deal_with_exception() | deal_with_exception()
} finally { | }
finalizes_connection() | finalizes_connection()
} |
Единственное различие обоих кодов состоит в том, что то, что удерживается в блоке try
, вызывает исключение, которое не является NetworkError
, например, MethodNotFound
. В первом случае будет вызван метод finalizes_connection()
, а во втором - нет.
Соединение, естественно, осуществляется через несколько программ. Так что же происходит в случае MethodNotFound
исключения для другой программы? В первом случае ваша программа завершит соединение, а другая программа будет счастлива. Во втором случае другая программа может ждать вашего ответа вечно. Что если другая программа может получить только одно соединение за раз? Вы только что прослушали другую программу.
Это также относится к файлу, например, который вы открыли, и другие программы не смогут открыть для чтения (в Windows). Что касается памяти, она никогда не освобождается, и теперь у вас есть утечка памяти.