Re: Проработает ли finally ???
От: Andrbig  
Дата: 17.08.04 12:34
Оценка: 4 (1) +1
Здравствуйте, FIR, Вы писали:

FIR>Скажите насколько корректен нижеприведённый код:

FIR>try{
FIR>    Connect.Open();
FIR>    AddCom.ExecuteNonQuery();
FIR>}
FIR>catch(Exception Ex){
FIR>    ErrorLbl.Text = "Произошли ошибки на этапе записи в базу данных. " + Ex.Message;
FIR>    return;
FIR>}
FIR>finally{
FIR>    Connect.Close();
FIR>}

ИМХО, некорректен. Причина: если исключение возникнет при Connect.Open() и коннект не будет открыт, то Connect.Close() все равно произойдет.
Re[2]: Проработает ли finally ???
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.08.04 12:38
Оценка: +1
Здравствуйте, clon, Вы писали:

C>P.S. лучше бы ты этот код просто запустил на выполнение и сам все увидел и трафик бы сэкономили


А еще лучше прочесть спецификацию языка.
... << RSDN@Home 1.1.4 beta 2 rev. 159>>
AVK Blog
Проработает ли finally ???
От: FIR Россия  
Дата: 17.08.04 09:04
Оценка:
Здраствуйте!

По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.

Скажите насколько корректен нижеприведённый код:
try{
    Connect.Open();
    AddCom.ExecuteNonQuery();
}
catch(Exception Ex){
    ErrorLbl.Text = "Произошли ошибки на этапе записи в базу данных. " + Ex.Message;
    return;
}
finally{
    Connect.Close();
}
Re: Проработает ли finally ???
От: clon Россия  
Дата: 17.08.04 09:15
Оценка:
Здравствуйте, FIR, Вы писали:

FIR>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.


Так и есть. Отработает.

P.S. лучше бы ты этот код просто запустил на выполнение и сам все увидел и трафик бы сэкономили
... << RSDN@Home 1.1.3 stable >>
Нельзя ничего сказать о глубине лужи, пока не попадешь в нее.
Re: Проработает ли finally ???
От: Аноним  
Дата: 17.08.04 09:18
Оценка:
Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!


FIR>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.


FIR>Скажите насколько корректен нижеприведённый код:

FIR>
FIR>try{
FIR>    Connect.Open();
FIR>    AddCom.ExecuteNonQuery();
FIR>}
FIR>catch(Exception Ex){
FIR>    ErrorLbl.Text = "Произошли ошибки на этапе записи в базу данных. " + Ex.Message;
FIR>    return;
FIR>}
FIR>finally{
FIR>    Connect.Close();
FIR>}
FIR>



Отработает обязхательно

Вообще по моему все "завершающие" действия, а не только освобождения ресурсов удобно пихать в finally.

Я часто делаю, что-то на подобие следующего.

try
{
switch (...)
{
case 1: return xxx;
case 2 return yyy;
....
}

}
finally
{
//все иденчные части case
}

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


Хотелось бы узнать мнение коллег, насколько такой подход эффективен по скорости.



Напр
Re: Проработает ли finally ???
От: Сат Украина  
Дата: 17.08.04 09:55
Оценка:
Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!


FIR>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.


Кстати не всегда finally отрабатывет
Re: Проработает ли finally ???
От: EM Великобритания  
Дата: 17.08.04 09:59
Оценка:
Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!


FIR>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.


FIR>Скажите насколько корректен нижеприведённый код:

FIR>
FIR>try{
FIR>    Connect.Open();
FIR>    AddCom.ExecuteNonQuery();
FIR>}
FIR>catch(Exception Ex){
FIR>    ErrorLbl.Text = "Произошли ошибки на этапе записи в базу данных. " + Ex.Message;
FIR>    return;
FIR>}
FIR>finally{
FIR>    Connect.Close();
FIR>}
FIR>



Connection — Disposable объект и для него читабельнее написать using
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: Проработает ли finally ???
От: Аноним  
Дата: 17.08.04 11:27
Оценка:
Здравствуйте, Сат, Вы писали:

Сат>Здравствуйте, FIR, Вы писали:


FIR>>Здраствуйте!


FIR>>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.


Сат>Кстати не всегда finally отрабатывет


Пример в студию!
Re[2]: Проработает ли finally ???
От: GAUT  
Дата: 17.08.04 11:34
Оценка:
Здравствуйте, EM, Вы писали:

EM>Connection — Disposable объект и для него читабельнее написать using


Согласен с пердыдущим оратором...
Кому Бог дал руки...а кому прищепки!
Re[2]: Проработает ли finally ???
От: SiAVoL Россия  
Дата: 17.08.04 11:46
Оценка:
Здравствуйте, EM, Вы писали:

EM>Connection — Disposable объект и для него читабельнее написать using

Может продемонстрируете как ичтабельно обработать исключения в конструкции using?
... << RSDN@Home 1.1.4 @@release >>
Re[3]: Проработает ли finally ???
От: Сат Украина  
Дата: 17.08.04 12:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пример в студию!


StackOverflowException и ExecutionEngineException — слыхали про такие?
а я вот второе даже получал
при чем все еще хуже, чем может быть — в добавку к тому, что блок finally не выполняется, так
ExecutionEngineException еще и catch-ем не ловиться(StackOverflowException — ловится)
Re: Проработает ли finally ???
От: Apollo13 Украина  
Дата: 17.08.04 15:16
Оценка:
Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!


FIR>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.


FIR>Скажите насколько корректен нижеприведённый код:

FIR>
FIR>try{
FIR>    Connect.Open();
FIR>    AddCom.ExecuteNonQuery();
FIR>}
FIR>catch(Exception Ex){
FIR>    ErrorLbl.Text = "Произошли ошибки на этапе записи в базу данных. " + Ex.Message;
FIR>    return;
FIR>}
FIR>finally{
FIR>    Connect.Close();
FIR>}
FIR>


finally не сработает если исключение произойдет в блоке catch например если ErrorLbl == null
Re[4]: Проработает ли finally ???
От: Angelic Dust Россия  
Дата: 17.08.04 15:32
Оценка:
Здравствуйте, Сат, Вы писали:

Сат>Здравствуйте, Аноним, Вы писали:


А>>Пример в студию!


Сат>StackOverflowException и ExecutionEngineException — слыхали про такие?

Сат>а я вот второе даже получал
Сат>при чем все еще хуже, чем может быть — в добавку к тому, что блок finally не выполняется, так
Сат>ExecutionEngineException еще и catch-ем не ловиться(StackOverflowException — ловится)

Если не ошибаюсь, то у Рихтера очень подробно объяснено почему именно эти два исключения не ловятся.
... << RSDN@Home 1.1.3 stable >>
Re[5]: Проработает ли finally ???
От: Сат Украина  
Дата: 17.08.04 15:46
Оценка:
AD>Если не ошибаюсь, то у Рихтера очень подробно объяснено почему именно эти два исключения не ловятся.
Не ошибаетесь.
Действительно у него вполне нормально расписано. Но только по первому
а еще у него упоминается в этой же кагорте OutOfMemoryException — это вообще фишка еще та — при возникновении такого экспешина catch и finally могут как вызываться, так и не вызываться...
Re[2]: Проработает ли finally ???
От: stalcer Россия  
Дата: 18.08.04 05:51
Оценка:
Здравствуйте, Apollo13, Вы писали:

A>finally не сработает если исключение произойдет в блоке catch например если ErrorLbl == null


Очень даже сработает.
... << RSDN@Home 1.1.3 beta 1 >>
Re[3]: Проработает ли finally ???
От: Apollo13 Украина  
Дата: 18.08.04 06:13
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Очень даже сработает.


Извиняюсь. Так и есть сработает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.