Re[4]: Писать ли в этом случае catch(Exception)?
От: midcyber
Дата: 12.08.10 05:09
Оценка:
Здравствуйте, Undying, Вы писали:

U>В приведенном коде в общем catch'е есть осмысленная стратегия — это логгирование в виде Console.WriteLine("Не удалось распарсить HTML"). Вышестоящий код не знает, что ошибка состоит в том, что "Не удалось распарсить HTML", соответственно без catch (Exception ex) тут никак не обойтись.


Приведенный код вообще не уведомляет вышестоящий код об ошибке.
Он просто втихую саботирует, против чего собственно guide по неперехвату System.Exception и пытается бороться.
Re[5]: Писать ли в этом случае catch(Exception)?
От: mrjeka Россия  
Дата: 12.08.10 05:38
Оценка: +1
Здравствуйте, midcyber, Вы писали:

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


U>>В приведенном коде в общем catch'е есть осмысленная стратегия — это логгирование в виде Console.WriteLine("Не удалось распарсить HTML"). Вышестоящий код не знает, что ошибка состоит в том, что "Не удалось распарсить HTML", соответственно без catch (Exception ex) тут никак не обойтись.


M>Приведенный код вообще не уведомляет вышестоящий код об ошибке.

M>Он просто втихую саботирует, против чего собственно guide по неперехвату System.Exception и пытается бороться.

Ну во всяком случае автор не указывал, что этот код является каким-либо подуровнем. С чего вы взяли, что это не вышестоящий код?
На какой уровень поднимать исключения это уже другой вопрос.
Re[5]: Писать ли в этом случае catch(Exception)?
От: Undying Россия  
Дата: 12.08.10 05:42
Оценка:
Здравствуйте, midcyber, Вы писали:

M>Приведенный код вообще не уведомляет вышестоящий код об ошибке.

M>Он просто втихую саботирует, против чего собственно guide по неперехвату System.Exception и пытается бороться.

А вопрос почитать, который автор топика задавал? Автор топика спрашивал нужно ли всегда писать специальную обработку каждого типа исключения и нужно ли писать обработчик непредвиденных типов исключений. Автор топика не спрашивал о том, что должно быть внутри catch'а, соответственно понятно, что внутри catch написана заглушка, просто для иллюстрации идеи. Если тебе эта заглушка не нравится напиши это автору топика, т.к. если она неправильная, то косяк будет и в первом варианте обработки исключений, и во втором.
Re: Писать ли в этом случае catch(Exception)?
От: andy1618 Россия  
Дата: 12.08.10 05:50
Оценка: +1
Здравствуйте, 0K, Вы писали:

0K>Пользователь указывает html (пусть в виде строки). Нужно проверить на корректность. Специального метода нет, но есть библиотека которая его парсит. Какой вариант проверки правильный:


0K>Вариант 1


0K>Вариант 2

0K>
0K>try
0K>{
0K>    doc.LoadHtml(html);
0K>}
0K>catch (Exception)
0K>{
0K>    Console.WriteLine("Не удалось распарсить HTML");
0K>    return;
0K>}
0K>


В обоих подходах плохо то, что мы игнорируем текст исключения. А он может сказать о многом.
Можно сделать так:
try
{
  doc.LoadHtml(html);
}
catch (Exception ex)
{
  // Приводим класс в целостное состояние
  ...

  // Обёртываем исключение, добавив понятный клиенту текст. 
  throw new HtmlDocumentException("Не удалось распарсить HTML.", ex);
}


Теперь в вызывающем коде верхнего уровня мы сможем показать пользователю культурное сообщение ("Не удалось распарсить HTML.") плюс по кнопочке "Подробнее" — показать текст внутреннего исключения (обычно это жутко выглядящий, но крайне полезный для опытного глаза набор строк).

Об ограничениях такого подхода с обёртыванием исключений написано, как обычно, в MSDN:
http://msdn.microsoft.com/en-us/library/ms229049.aspx
Re[3]: Писать ли в этом случае catch(Exception)?
От: SE Украина  
Дата: 12.08.10 10:58
Оценка: 14 (2)
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, midcyber, Вы писали:


M>>Да, внешне будут "рюшечки" — никогда не падающая программа.

M>>Возможно, показывающая пользователю пустое окно вместо данных. Возможно, некорректные данные, что еще хуже.

0K>А как в данном случае тип исключения может повлиять на появление пустого окна или некорректные данные? Вы видите хоть один вариант.


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

Ты говорил как-то, что мы тут не медицинский софт пишем, но я лучше потеряю полчаса работы в ворде, когда он закроется, чем весь документ, когда он мне его радосно перезатрет и скажет, что все ОК.
Re[4]: Писать ли в этом случае catch(Exception)?
От: Dog  
Дата: 12.08.10 13:29
Оценка:
M>>Так и зачем их вообще тут перехватывать, если нет осмысленных стратегий?
M>>Почему не передать выше, пусть разбирается тот, у кого они есть
U>В приведенном коде в общем catch'е есть осмысленная стратегия — это логгирование в виде Console.WriteLine("Не удалось распарсить HTML").
О, логирование ja ja , а потом кто-то видя это добавляет сюда валидацию или ещё что и пошло поехало.
А послезавтра мы захотели Log4net
Re[2]: А вот фиг :)
От: akasoft Россия  
Дата: 12.08.10 14:11
Оценка: +1
Здравствуйте, MozgC, Вы писали:

(Всё-таки отправлю сообщение.)

В приведённом тобой варианте 3 дублирования не меньше.

1. Почему ты перехватил ArgumentException, FormatException, IndexOutOfRangeException и InvalidOperationException, а деление на ноль пропустил?
2. Почему у тебя на каждое перехваченное исключение реакция одна и та же? А если нет разницы, то что называется "только программист мог дать такой верный, но абсолютно бесполезный ответ"?

Использовать враппер для работы со сторонней библиотекой хорошая идея. Использовать в этом же враппере враппер для исключений — тоже хорошая идея. Но автор темы спрашивал не про это.

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

Обрати внимание на то, сколько сейчас в dotnet активных тем этого автора, и все они про работу с исключениями.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>> SQL Express 2008 R2
Re[3]: А вот фиг :)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.08.10 14:22
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Обрати внимание на то, сколько сейчас в dotnet активных тем этого автора, и все они про работу с исключениями.


Количество активных тем — не есть признак компетенции автора в вопросе.
Re[4]: А вот фиг :)
От: akasoft Россия  
Дата: 12.08.10 15:31
Оценка:
Здравствуйте, samius, Вы писали:

S>Количество активных тем — не есть признак компетенции автора в вопросе.


Не есть. Но признак желания автора в этом вопросе разобраться.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>> SQL Express 2008 R2
Re[5]: А вот фиг :)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.08.10 15:41
Оценка: +1 :)
Здравствуйте, akasoft, Вы писали:

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


S>>Количество активных тем — не есть признак компетенции автора в вопросе.


A>Не есть. Но признак желания автора в этом вопросе разобраться.


Только то, чем он занимается в этих темах — сложно классифицировать как попытку разобраться. Его посты полны недоумения, почему остальные с ним спорят и не понимают очевидных для него вещей. Вот лет через 7 все поумнеют, тогда можно будет продолжить.
Re[5]: А вот фиг :)
От: SE Украина  
Дата: 12.08.10 15:43
Оценка:
Здравствуйте, akasoft, Вы писали:

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


S>>Количество активных тем — не есть признак компетенции автора в вопросе.


A>Не есть. Но признак желания автора в этом вопросе разобраться.


Скорее признак желания навязать сообществу свои воззрения. Иногда интересные, а иногда и нет.
Re[4]: Писать ли в этом случае catch(Exception)?
От: 0K Ниоткуда  
Дата: 12.08.10 21:11
Оценка: :)
Здравствуйте, SE, Вы писали:

SE>Существует три типа эксепшенов, которые могут возникнуть в любой момент при том, что ваш код может быть корректным (а вот чужой вызываемый — нет): переполнение стека, отсутствие памяти и ошибка рантайма.

SE>Их можно проигнорировать, но последствия могут быть непредсказуемые для пользователя и его данных.

И действительно. Это системные исключения. Если бы иерархия исключений была структуризирована по моей концепции -- таких проблемы бы не было.
Re[4]: Писать ли в этом случае catch(Exception)?
От: andy1618 Россия  
Дата: 13.08.10 05:47
Оценка:
Здравствуйте, SE, Вы писали:

SE>Ты говорил как-то, что мы тут не медицинский софт пишем, но я лучше потеряю полчаса работы в ворде, когда он закроется, чем весь документ, когда он мне его радосно перезатрет и скажет, что все ОК.


+100!
Это классический пример выбора между устойчивостью и корректностью
Автор: andy1618
Дата: 11.08.10
программы.
Re[5]: А вот фиг :)
От: midcyber
Дата: 13.08.10 07:30
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Не есть. Но признак желания автора в этом вопросе разобраться.


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