Re[3]: Массовая обертка функций
От: MozgC США http://nightcoder.livejournal.com
Дата: 09.03.10 19:10
Оценка:
Здравствуйте, _FRED_, Вы писали:

U>> DateTime startTime = DateTime.UtcNow;

U>> do
U>> {
U>> }
U>> while (DateTime.UtcNow — startTime < timeOut);
_FR>[/c#]

_FR>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки?


Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).
Re[4]: Массовая обертка функций
От: MozgC США http://nightcoder.livejournal.com
Дата: 09.03.10 19:15
Оценка:
Здравствуйте, Кондор, Вы писали:

_FR>>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки?

К>Ну и дурак ваш пользователь! Его за такие действия судьба накажет

К сожалению, практика показывает, что такие вещи надо учитывать, я сам несколько раз словил на этом проблемы, когда пользователь переводил часы. Теперь я умнее. А винить пользователей — нет, это неправильный подход при разработке. В задачи программиста все-таки входит обеспечение надежного выполнения программы, а не так, что шаг влево, шаг вправо — косяк.
А вообще, вы уж простите, но если бы в моей команде программер такое сказал, я бы с ним очень жестко поговорил, чтобы таких заявлений больше не было.
Re: Массовая обертка функций
От: para  
Дата: 09.03.10 19:23
Оценка: :)
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Понадобилось тут сделать пуленепробиваемую программу. То есть — что-бы при пропадании сети и файловые операции и операции с базами данных не вываливались по ошибке, а пытались исполнится еще минуту.


Если интересно, посмотрите в сторону nemerle
http://nemerle.rsdn.ru/Design_patterns
Re[4]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 06:01
Оценка:
Здравствуйте, MozgC, Вы писали:

_FR>>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки?


MC>Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).


Это слишком просто. Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п. Как вот здесь
Автор: alexsoff
Дата: 09.03.10
, например, показано — да если захотеть поискать грабли, найти их можно с целый сарай.

В первую очередь надо опеределить цель, которую необходимо достичь "массовой обёрткой" — от чего он уберегается, где "обёртка" (и какая) ему действительно поможет. Пока что это вот
Автор: Nikolay_P_I
Дата: 09.03.10
выглядит как настоящая порнография и смотреть такое несовершеннолетним разработчикам крайне не рекомендуется (хотя в "промышленном" коде можно и не такое встретить ).

Когда же стратегии обработки будут ясны и реализованы, выполнить механику подключения к ним хоть врукопашную, хоть с помощью PostSharp/Profiler или любого другого механизма будет совершенно не сложно. Самое быстрое (если никакого механизма перехвата пока нет) — действительно вручную. Отладить стратегии, убедиться, что они "живут" и можно уже колдовать над автоматизацией и декларативностью применения данного похода.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Массовая обертка функций
От: Undying Россия  
Дата: 10.03.10 06:28
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.


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

Правда пытаться выполнить операцию минуту на мой взгляд чересчур, но впрочем я не знаю специфику задач автора топика.
Re[6]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 06:39
Оценка:
Здравствуйте, Undying, Вы писали:

_FR>>Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.


U>Это называется титаническая работа за плевые деньги. При работе с внешним окружением (той же сетью) в случае ошибки после небольшой паузы делать вторую попытку выполнить действие весьма полезная практика, позволяющая сделать совершенно незаметными для пользователя мелкие сбои окружения (а таких сбоев обычно достаточно много). При этом в общем виде реализация занимает 5 минут, а вот если разбираться с типами исключений, то и пяти лет может не хватить.


Так что мешает отловить именно сетевое исключение и "поколдовать" над ним, а все остальные просто пропускать наружу, если уж нам лень или мы просто не в состоянии их все проконтролировать?
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Массовая обертка функций
От: Undying Россия  
Дата: 10.03.10 06:51
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Так что мешает отловить именно сетевое исключение и "поколдовать" над ним, а все остальные просто пропускать наружу, если уж нам лень или мы просто не в состоянии их все проконтролировать?


Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.
Re[8]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 07:33
Оценка:
Здравствуйте, Undying, Вы писали:

_FR>>Так что мешает отловить именно сетевое исключение и "поколдовать" над ним, а все остальные просто пропускать наружу, если уж нам лень или мы просто не в состоянии их все проконтролировать?


U>Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.


Можно пример, в котором сетевая ошибка представляется, например, ArgumentNullException?
Help will always be given at Hogwarts to those who ask for it.
Re[9]: Массовая обертка функций
От: Nikolay_P_I  
Дата: 10.03.10 08:40
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

U>>Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.


_FR>Можно пример, в котором сетевая ошибка представляется, например, ArgumentNullException?


ArgumentNullException не знаю, а вот в одной функции есть и Ping и работа с WMI и создание директории. И вылетает оттуда и "TimeOut" и "RPC service not available" и "Access Denied". Нет, конечно, можно все такие исключения отфильтровывать. Вопрос — сколько на это времени убьется и денег уйдет.
Re[10]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 08:55
Оценка: +1 :)
Здравствуйте, Nikolay_P_I, Вы писали:

U>>>Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.


_FR>>Можно пример, в котором сетевая ошибка представляется, например, ArgumentNullException?


N_P>ArgumentNullException не знаю, а вот в одной функции есть и Ping и работа с WMI и создание директории. И вылетает оттуда и "TimeOut" и "RPC service not available" и "Access Denied". Нет, конечно, можно все такие исключения отфильтровывать. Вопрос — сколько на это времени убьется и денег уйдет.


А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.

Ну что ж, в таком случае вам действительно лучше всего всё-таки научиться разбираться, что же в вашем коде может происходить, прежде чем что-то исправлять. Думаете, доктор Хаус напрасно ест свои таблетки? В тяжёлых случаях, когда

в одной функции есть и Ping и работа с WMI и создание директории. И вылетает оттуда и "TimeOut" и "RPC service not available" и "Access Denied"

диагностика нужна как никогда и приниматься за лечение не знаю, от чего же мы пытаемся избавиться преступно вдвойне.
Help will always be given at Hogwarts to those who ask for it.
Re[11]: Массовая обертка функций
От: Nikolay_P_I  
Дата: 10.03.10 09:07
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.


Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль".
Re[11]: Массовая обертка функций
От: Аноним  
Дата: 10.03.10 09:21
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.

_FR>... бла-бла-бла остальное поскипано

потрясающая способность в нескольких предложениях не оставить ни капли смысла. критика как всегда прет с невероятным апломбом, но по сути — ни капли информации.
попробуй иногда предлагать решения а не просто разносить в пух и прах "чтиво для несовершеннолетних"
Re[12]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 09:30
Оценка:
Здравствуйте, Аноним, Вы писали:

_FR>>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.


_FR>>... бла-бла-бла остальное поскипано


Не нужно свои слова квотить как мои.

А>

А>потрясающая способность в нескольких предложениях не оставить ни капли смысла.

Если ты не видишь смысла, это вовсе не значит, что его там нет. Судя по ответу топикстартера он-то смысл увидел, раз уж возразил.

А>критика как всегда


Ну так уж и всегда.

А>прет с невероятным апломбом, но по сути — ни капли информации.


Сформулируй "суть" в данном контексте. По сути было сказано, что "у вас бардак и начинать лечить нужно от него". И это не прозрачно. Хочется потролить — продолжай в том же духе.

А>попробуй иногда предлагать решения а не просто разносить в пух и прах "чтиво для несовершеннолетних"


Решение чего ты предлагаешь мне предложить? На стартовый вопрос я уже ответил. В этой ветке объяснил почему решение должно быть именно таким. Если ты не понял чего-то спроси конкретно что. Если понял — возражай более конкретно.
Help will always be given at Hogwarts to those who ask for it.
Re[12]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 09:34
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

_FR>>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.


N_P>Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль".


Что-то я запутался — как это — то

вылетает оттуда и "TimeOut" и "RPC service not available" и "Access Denied"

а то

вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя



Очень тяжело отвечать на несогласованные и непоследовательные возражения.

Ещё раз: так какие же исключения вылетают из методов, которые нужно "массово обернуть"? Можно ли в принципе узнать по этим исключениям их, исключений, причину возникновения?
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Массовая обертка функций
От: MozgC США http://nightcoder.livejournal.com
Дата: 10.03.10 10:38
Оценка:
Здравствуйте, _FRED_, Вы писали:

MC>>Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).


_FR>Это слишком просто. Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.


Можно просто дополнительно передавать params Type[] с типами исключений, которые надо хэндлить, и при которых нужно повторно пробовать. Это, возможно, может потребовать некоторой работы по приведению методов в нормальный вид, чтобы они выбрасывали только определенные, документированные типы исключений, а не все подряд. Что в принципе всегда полезно.
У нас что-то типа такого используется при работе с удаленным веб-сервисом — там где нужно ловим WebException и если поймали — делаем таймаут и повторяем вызов функции.
Re[6]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 10:45
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>>>Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).


_FR>>Это слишком просто. Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.


MC>Можно просто дополнительно передавать params Type[] с типами исключений, которые надо хэндлить, и при которых нужно повторно пробовать.


Это уже механика — как и что передавать и реализовать её можно большим набором инструментальных средств.

MC>Это, возможно, может потребовать некоторой работы по приведению методов в нормальный вид, чтобы они выбрасывали только определенные, документированные типы исключений, а не все подряд. Что в принципе всегда полезно.

MC>У нас что-то типа такого используется при работе с удаленным веб-сервисом — там где нужно ловим WebException и если поймали — делаем таймаут и повторяем вызов функции.

А как же статус?
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Массовая обертка функций
От: Roman Odaisky Украина  
Дата: 10.03.10 11:12
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки?


А в .NET есть аналог clock_gettime(CLOCK_MONOTONIC) из POSIX?
До последнего не верил в пирамиду Лебедева.
Re[4]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 11:19
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

_FR>>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки?


RO>А в .NET есть аналог clock_gettime(CLOCK_MONOTONIC) из POSIX?


Ну прям такого нету. Но вот "зачем"? Есть Environment.TickCount — который не перевести, но который может врапнуться, есть Stopwatch. За глаза и за уши.
Help will always be given at Hogwarts to those who ask for it.
Re[13]: Массовая обертка функций
От: Nikolay_P_I  
Дата: 10.03.10 11:58
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>>>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.

N_P>>Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль".

_FR>Что-то я запутался — как это — то

_FR>

_FR>вылетает оттуда и "TimeOut" и "RPC service not available" и "Access Denied"

_FR>а то
_FR>

_FR>вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя

_FR>

_FR>Очень тяжело отвечать на несогласованные и непоследовательные возражения.

_FR>Ещё раз: так какие же исключения вылетают из методов, которые нужно "массово обернуть"? Можно ли в принципе узнать по этим исключениям их, исключений, причину возникновения?

Не понимаю, что не понятно ? Из метода вылетают исключения, группированные по реакции. Одни исключения ловятся и юзер принимает о них меры. А вот другие... Программе и юзеру в большинстве случаев — абсолютно пофигу почему именно программа не может продолжать работу в сетевой директории. То ли сервер удаленный выключен то ли диск из него выдернули то ли директорию снесли. И я не вижу никаких причин все эти проблемы анализировать. "Неустранимая ошибка в работе, данные спасены насколько можно, в лог причина записана — зовите админа". Пусть смотрит что там написано, InnerException никуда не пропало.
Так что узнать причину неполадки — можно. Нужно ли ?
Re[12]: Массовая обертка функций
От: GlebZ Россия  
Дата: 10.03.10 12:14
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль".

Основная проблема не в обработке, а в самой постановке задачи. Это примерно как из подводной лодки забомбарить танк, в надежде что он вдруг подъедет к берегу. Таким способом сделать "пуленепробиваемую программу" не получится.
Задача хочу залогировать любое исключение — имеет право на жизнь. Но вот повторить операцию потому что а вдруг по правильному шибанёт — в корне неверно. Операций которые могут повториться но уже с успехом — очень немного. Такие места можно определить исходя из контекста задачи. И адресно решать. Нужно решить где возможна ошибка. Что будем делать — останавливать программу, останавливать сценарий, или попробовать повторить. И вылавливать ситуации нужно не на уровне команды, а на уровне подпрограмм.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.