try
{
..
}
catch(Exception e)
{
throw UserException;
}
finally
{
..
}
зачем нужна конструкция finally?
try {
//code...
}
catch (Exception e) {
//exception handler...
}
finally {
//final code...
}
блок finally вызывается вне зависимости от того произошло исключение в try или нет. Также он вызывается независимо от того, обработано ли исключение в одном из catch. Дык начерта он вообще нужен? Когда код из finally исполнен не будет? В книге прочитал такую хрень: "блок finally полезен для закрытия файлов и освобождения ресурсов" - великолепное пояснение:D
Код:
Если блока finally не будет, то управление после вызова исключения передастся блоку(функции) на порядок выше.
Если же блок finally существует, то до передачи управления обработается блок finally.
Такая конструкция обеспечивает освобождение ресурсов(закрытие файлов).
В C# также используется конструкция using.
Код:
try {
открыли соединение с БД;
...
что-то делаем с БД;
...
return value;
}
catch (Exception e) {
Видимо, либо БД накрылась, либо еще что-то произошло -> выходим из функции;
}
finally {
закрываем соеднинение с бд;
}
открыли соединение с БД;
...
что-то делаем с БД;
...
return value;
}
catch (Exception e) {
Видимо, либо БД накрылась, либо еще что-то произошло -> выходим из функции;
}
finally {
закрываем соеднинение с бд;
}
Таким образом гарантируется, что чтобы ни случилось - соединение с БД закроется ВСЕГДА, даже если сделан return.
Как я читал про яву, этот язык избавлен от многих излишеств, которые запутывают программиста. По моему Finally - как раз то самое излишество.
Цитата: littlefrankie
Всё равно не понятно каково практическое применение finally?.
Aoli хороший пример привел, официально же это звучит так - [quote=Gosling]Предложение finally конструкции try предоставляет механизм передачи управления определенному блоку кода, не зависящий от итогов выполнения кода в блоке try [/quote].
Можно сказать так - если в коде есть блок finally - то, зайдя в блок try - его уже никак не обойти.
Приведу два практических способа примениея этой конструкции, чтобы ты не думал, что это семантическое и синтаксическое излишество:)
1. Пусть есть две операции, a() и b() - причем, необходимо, чтобы если выполнилось a() , выполнится и b(). Тогда пишем -
Код:
a();
try
{
// Что то делаем
}
finally
{
b();
}
try
{
// Что то делаем
}
finally
{
b();
}
a() вызывается вне блока проверки, и потому - если она вызовет проблемы, то b() тоже не выполнится. Если же выполнится a() - то управление перейдет в итоге, после кола try {} в блок finally{} всегда.
2.
Код:
Object val = null;
try
{
val = до();
// Другой код
}
finally
{
if(val == null) после();
}
try
{
val = до();
// Другой код
}
finally
{
if(val == null) после();
}
Так мы может отлавливать исключения до(), без помощт внешних средств.