Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2009, 16:52   #1
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию Зачем нужен finally?

Есть разница - поместить код в блок finally или просто после блока catch?
ds.Dante вне форума Ответить с цитированием
Старый 14.09.2009, 16:58   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Мне кажется, что разница только в стиле написания.
Hollander вне форума Ответить с цитированием
Старый 14.09.2009, 17:23   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

А второй вариант - это дурной тон?
ds.Dante вне форума Ответить с цитированием
Старый 14.09.2009, 17:31   #4
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Цитата:
Ключевые слова try и catch используются вместе. Если предполагается, что блок кода может вызвать исключение, воспользуйтесь ключевым словом try, и используйте catch, чтобы сохранить код, который будет выполнен при возникновении исключения. В этом примере в результате деления на ноль создается исключение, которое затем перехватывается. При отсутствии блоков try и catch произойдет сбой программы.

Блоки finally
Код, содержащийся в блоке finally, выполняется всегда, вне зависимости от возникновения исключения. Чтобы гарантировать возвращение ресурсов, например, убедиться, что файл закрыт, используйте блок finally.
msdn считает по другому.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 14.09.2009, 17:32   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Нет, не дурной тон, и разница есть.
Блок finally сделан для того, чтобы если вылетело исключение в блоке try - catch и нужно вернуться на уровень выше, код в блоке finally выполнялся всегда. То есть даже если вылетит исключение и вы не сможете обработать его в catch - блок finally выполнится.

Пример из жизни:
1. Открываем файл
2. Читаем
3. При чтении получаем исключение
4. В блоке finally закрытие файла.

В следствие чего файл закроется, если вылетит исключение и программа рухнет или программист забудет обработать это исключение.
MaTBeu вне форума Ответить с цитированием
Старый 14.09.2009, 18:04   #6
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Многое зависит от того, как ты обработаешь ошибку. Можно и без выхода на верхний уровень.
Hollander вне форума Ответить с цитированием
Старый 14.09.2009, 19:03   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Сообщение от Hollander Посмотреть сообщение
Многое зависит от того, как ты обработаешь ошибку. Можно и без выхода на верхний уровень.
Если не обработаешь - пойдет на верхний уровень. А там должны знать, что внизу что-то не сработало.
MaTBeu вне форума Ответить с цитированием
Старый 14.09.2009, 19:12   #8
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Если не обработаешь
В этом то все и дело. Предлагаю закончить этот холивар. Лучше писать с finally - это факт.
Hollander вне форума Ответить с цитированием
Старый 14.09.2009, 19:34   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Никакого холивара - каждый изъясняет свою точку зрения.
Цитата:
Лучше писать с finally - это факт.
Согласен.
MaTBeu вне форума Ответить с цитированием
Старый 15.09.2009, 12:09   #10
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

То есть, как я понял, различие появляется, если есть два вложенных блока try. Тогда такой вопрос.
Цитата:
Сообщение от MaTBeu Посмотреть сообщение
1. Открываем файл
2. Читаем
3. При чтении получаем исключение
4. В блоке finally закрытие файла.
Выглядеть это должно примерно так:

Код:
try
{
	FileStream FStream = new FileStream ("input.txt", FileMode.Open);
	Console.WriteLine ("File open OK");
}
catch
{
	Console.WriteLine ("File open error");
}
finally
{
	FStream.Close();
	Console.WriteLine ("File closed");
}
Error: The name 'FStream' does not exist in the current context (в блоке finally).



Код:
FileStream FStream;
try
{
	FStream = new FileStream ("input.txt", FileMode.Open);
	Console.WriteLine ("File open OK");
}
catch
{
	Console.WriteLine ("File open error");
}
finally
{
	FStream.Close ();
	Console.WriteLine ("File closed");
}
Error: Use of unassigned local variable 'FStream' (там же).



Если инициализировать FStream значением null, то при исключении програма вылетает с ошибкой.

Последний раз редактировалось ds.Dante; 15.09.2009 в 12:14.
ds.Dante вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
.NET, зачем он нужен? Qousio Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 80 18.12.2009 23:42
Зачем нужен void? Сергей089 Общие вопросы C/C++ 7 23.03.2009 17:08
Зачем живем? Simply-Art Свободное общение 6 16.10.2008 15:44
Зачем указателю тип? Scratch Общие вопросы C/C++ 5 30.09.2008 11:48
Зачем принтеру процессор? Иллидан Компьютерное железо 6 21.05.2008 20:11