По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.
Скажите насколько корректен нижеприведённый код:
try{
Connect.Open();
AddCom.ExecuteNonQuery();
}
catch(Exception Ex){
ErrorLbl.Text = "Произошли ошибки на этапе записи в базу данных. " + Ex.Message;
return;
}
finally{
Connect.Close();
}
Здравствуйте, 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
}
хотя исключения даже потенциально не могут быть сгенерены в свиче.
Хотелось бы узнать мнение коллег, насколько такой подход эффективен по скорости.
Здравствуйте, FIR, Вы писали:
FIR>Здраствуйте!
FIR>По-определению, блок кода помещённый в finally проработает независимо от того, произошло исключение или нет.
Здравствуйте, 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 отрабатывет
Здравствуйте, EM, Вы писали:
EM>Connection — Disposable объект и для него читабельнее написать using
Может продемонстрируете как ичтабельно обработать исключения в конструкции using?
Здравствуйте, Аноним, Вы писали:
А>Пример в студию!
StackOverflowException и ExecutionEngineException — слыхали про такие?
а я вот второе даже получал
при чем все еще хуже, чем может быть — в добавку к тому, что блок finally не выполняется, так
ExecutionEngineException еще и catch-ем не ловиться(StackOverflowException — ловится)
Здравствуйте, 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
Здравствуйте, Сат, Вы писали:
Сат>Здравствуйте, Аноним, Вы писали:
А>>Пример в студию!
Сат>StackOverflowException и ExecutionEngineException — слыхали про такие? Сат>а я вот второе даже получал Сат>при чем все еще хуже, чем может быть — в добавку к тому, что блок finally не выполняется, так Сат>ExecutionEngineException еще и catch-ем не ловиться(StackOverflowException — ловится)
Если не ошибаюсь, то у Рихтера очень подробно объяснено почему именно эти два исключения не ловятся.
AD>Если не ошибаюсь, то у Рихтера очень подробно объяснено почему именно эти два исключения не ловятся.
Не ошибаетесь.
Действительно у него вполне нормально расписано. Но только по первому
а еще у него упоминается в этой же кагорте OutOfMemoryException — это вообще фишка еще та — при возникновении такого экспешина catch и finally могут как вызываться, так и не вызываться...