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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2012, 19:27   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Вопрос Перехват ошибок ввода-вывода

Вот такой вопрос. Насколько я понял из MSDN, все ошибки ввода-вывода являются производными от IOException. Т.е. вообще все? Ошибка открытия файла, файл в некорректном состоянии, и всё остальное? И правильно ли так будет перехватить все такие ошипки?
Код:
try
{
    myFile = new StreamReader(directory);
}
catch(IOException e)
{
   // обработка
}
Или ещё что-то надо учитывать?
_-Re@l-_ вне форума Ответить с цитированием
Старый 16.01.2012, 19:34   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Если быть уверенным, что возможна только ошибка I/O то этот код правильный. Если же в блоке try...catch будет другая логика, то надо обрабатывать и ошибки другого типа. Лично я всегда обрабатываю все ошибки:
Код:
try
{
    myFile = new StreamReader(directory);
}
catch(Exception e)
{
   // обработка
}
Но если в случае какого типа ошибки нужна специфическая логика, то так:
Код:
try
{
    myFile = new StreamReader(directory);
}
catch(Exception e)
{
if (e is IOException)
   // обработка I/O ошибки
else
  // обработка остальных ошибок
}
Hollander вне форума Ответить с цитированием
Старый 16.01.2012, 20:12   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Опа, прикольно. Спасибо.
_-Re@l-_ вне форума Ответить с цитированием
Старый 16.01.2012, 21:19   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Hollander Посмотреть сообщение
Но если в случае какого типа ошибки нужна специфическая логика, то так:
Код:
try
{
    myFile = new StreamReader(directory);
}
catch(Exception e)
{
if (e is IOException)
   // обработка I/O ошибки
else
  // обработка остальных ошибок
}
Так не надо, для обработки разных типов ошибок есть поддержка со стороны языка в виде множества catch-блоков
Код:
try {
  myFile = new StreamReader(directory);
} catch (IOException ioex) {
  ...
} catch (Exception ex) { // или, если информация об исключении не нужна, то просто catch {
  ...
}
netrino вне форума Ответить с цитированием
Старый 18.01.2012, 14:20   #5
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Базовый Exception перехватывать не рекомендуется. http://msdn.microsoft.com/ru-ru/library/ms229005.aspx
ds.Dante вне форума Ответить с цитированием
Старый 18.01.2012, 14:30   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Не рекомендуется != не нужно. Особенно на верхних уровнях логики. Внезапная смерть программы из-за необработанного некритического исключения тоже не есть хорошо
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 18.01.2012, 15:41   #7
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Во-первых, в дотнете программы не умирают, а выдают осмысленное сообщение с возможностью проигнорировать исключение. А во-вторых, непредсказуемое поведение программы из-за какого-нибудь экзотического исключения (которое программист никак не предвидел) ничем не лучше.

Исключения из правила:
1) Если программа вообще не должна выдавать сообщения об ошибке, например, какой-нибудь скрытый шпион. :)
2) Если каждое исключение должно сопровождаться каким-то действием, при этом исключение не должно подавляться. Например:
Код:
try
{
  Foo ();
}
catch (Exception e)
{
  Debug.WriteLine (e);
  throw;
}
3) Вызов стороннего кода, который можно вообще убить, и спокойно продолжить работать в основной программе.

Последний раз редактировалось ds.Dante; 18.01.2012 в 15:55.
ds.Dante вне форума Ответить с цитированием
Старый 18.01.2012, 17:29   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Во-первых, в дотнете программы не умирают, а выдают осмысленное сообщение с возможностью проигнорировать исключение.
Мрут как милые, не проигнорируешь. А назвать "Прекращена работа программы %softname%" осмысленным сообщением у меня бы язык не повернулся.

Цитата:
А во-вторых, непредсказуемое поведение программы из-за какого-нибудь экзотического исключения (которое программист никак не предвидел)
Если обрабатываешь exception, то должен знать как поступить в случае его возникновения. Бездумные конструкции типа
Код:
try
{
  //какой-то код
}
catch {  }
я тоже не приветствую.

В случае, если скорректировать работу программы после возникновения ошибки (даже непредусмотренной) не получается, то, безусловно, программа должна завершить работу.
Не тупо свалиться с дефолтным сообщением дотнета, а выдать нормальное сообщение с причиной краха. По хорошему еще и запротоколировать крах в лог.
Хотя в подавляющем большинстве случаев в моих проектах эту логику реализует обработчик Application.UnhandledException (или Dispatcher.UnhandledException)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 18.01.2012, 20:26   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Мрут как милые, не проигнорируешь. А назвать "Прекращена работа программы %softname%" осмысленным сообщением у меня бы язык не повернулся.
у меня лично выдается хорошее сообщение с полной информацией об исключении.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.01.2012, 23:28   #10
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
...в дотнете программы не умирают, а...
Не "в дотнете", а в WinForms. Не нужно так обобщать.
В WPF или Silverlight дела обстоят именно так, как я описал.

Цитата:
у меня лично выдается хорошее сообщение с полной информацией об исключении.
В WinForms - да. Давно не использовал эту технологию, забыл как там unhandled exceptions себя ведут
И, тем не менее, остаюсь при мнении, что исключения должен обрабатывать программист. Даже если программа при их возникновении должна завершаться
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отключение ошибок ввода вывода nikolas0 Общие вопросы Delphi 5 06.02.2011 00:15
перехват ошибок Марк Охман БД в Delphi 5 08.12.2010 16:03
Перехват ошибок компилятора Яр|/||< (^_^) Общие вопросы Delphi 4 27.03.2010 16:07
Перехват ошибок от Windows DRUNE Софт 2 09.04.2009 13:24
перехват консольного ввода\вывода Артем5555555 Win Api 14 28.10.2008 23:20