Здравствуйте, _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)).
Здравствуйте, Кондор, Вы писали:
_FR>>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки? К>Ну и дурак ваш пользователь! Его за такие действия судьба накажет
К сожалению, практика показывает, что такие вещи надо учитывать, я сам несколько раз словил на этом проблемы, когда пользователь переводил часы. Теперь я умнее. А винить пользователей — нет, это неправильный подход при разработке. В задачи программиста все-таки входит обеспечение надежного выполнения программы, а не так, что шаг влево, шаг вправо — косяк.
А вообще, вы уж простите, но если бы в моей команде программер такое сказал, я бы с ним очень жестко поговорил, чтобы таких заявлений больше не было.
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>Понадобилось тут сделать пуленепробиваемую программу. То есть — что-бы при пропадании сети и файловые операции и операции с базами данных не вываливались по ошибке, а пытались исполнится еще минуту.
Здравствуйте, MozgC, Вы писали:
_FR>>А если во время выполнения пользователь время переведёт? А если не вперёд, а назад на сутки?
MC>Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).
Это слишком просто. Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п. Как вот здесь
, например, показано — да если захотеть поискать грабли, найти их можно с целый сарай.
В первую очередь надо опеределить цель, которую необходимо достичь "массовой обёрткой" — от чего он уберегается, где "обёртка" (и какая) ему действительно поможет. Пока что это вот
выглядит как настоящая порнография и смотреть такое несовершеннолетним разработчикам крайне не рекомендуется (хотя в "промышленном" коде можно и не такое встретить ).
Когда же стратегии обработки будут ясны и реализованы, выполнить механику подключения к ним хоть врукопашную, хоть с помощью PostSharp/Profiler или любого другого механизма будет совершенно не сложно. Самое быстрое (если никакого механизма перехвата пока нет) — действительно вручную. Отладить стратегии, убедиться, что они "живут" и можно уже колдовать над автоматизацией и декларативностью применения данного похода.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.
Это называется титаническая работа за плевые деньги. При работе с внешним окружением (той же сетью) в случае ошибки после небольшой паузы делать вторую попытку выполнить действие весьма полезная практика, позволяющая сделать совершенно незаметными для пользователя мелкие сбои окружения (а таких сбоев обычно достаточно много). При этом в общем виде реализация занимает 5 минут, а вот если разбираться с типами исключений, то и пяти лет может не хватить.
Правда пытаться выполнить операцию минуту на мой взгляд чересчур, но впрочем я не знаю специфику задач автора топика.
Здравствуйте, Undying, Вы писали:
_FR>>Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.
U>Это называется титаническая работа за плевые деньги. При работе с внешним окружением (той же сетью) в случае ошибки после небольшой паузы делать вторую попытку выполнить действие весьма полезная практика, позволяющая сделать совершенно незаметными для пользователя мелкие сбои окружения (а таких сбоев обычно достаточно много). При этом в общем виде реализация занимает 5 минут, а вот если разбираться с типами исключений, то и пяти лет может не хватить.
Так что мешает отловить именно сетевое исключение и "поколдовать" над ним, а все остальные просто пропускать наружу, если уж нам лень или мы просто не в состоянии их все проконтролировать?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Так что мешает отловить именно сетевое исключение и "поколдовать" над ним, а все остальные просто пропускать наружу, если уж нам лень или мы просто не в состоянии их все проконтролировать?
Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.
Здравствуйте, Undying, Вы писали:
_FR>>Так что мешает отловить именно сетевое исключение и "поколдовать" над ним, а все остальные просто пропускать наружу, если уж нам лень или мы просто не в состоянии их все проконтролировать?
U>Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.
Можно пример, в котором сетевая ошибка представляется, например, ArgumentNullException?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
U>>Мешает то, что окружение может бросать очень большое количество типов исключений, и разбираться какие из видов ошибок имеют шанс быть исправленными второй попыткой, а какие нет, это титаническая, но ни кому не нужная работа, т.к. нет ничего страшного в том, что попытка будет произведена второй раз для ошибки, которая заведомо не может быть исправлена.
_FR>Можно пример, в котором сетевая ошибка представляется, например, ArgumentNullException?
ArgumentNullException не знаю, а вот в одной функции есть и Ping и работа с WMI и создание директории. И вылетает оттуда и "TimeOut" и "RPC service not available" и "Access Denied". Нет, конечно, можно все такие исключения отфильтровывать. Вопрос — сколько на это времени убьется и денег уйдет.
Здравствуйте, 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.
Здравствуйте, _FRED_, Вы писали:
_FR>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.
Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль".
Re[11]: Массовая обертка функций
От:
Аноним
Дата:
10.03.10 09:21
Оценка:
Здравствуйте, _FRED_, Вы писали:
_FR>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя. _FR>... бла-бла-бла остальное поскипано
потрясающая способность в нескольких предложениях не оставить ни капли смысла. критика как всегда прет с невероятным апломбом, но по сути — ни капли информации.
попробуй иногда предлагать решения а не просто разносить в пух и прах "чтиво для несовершеннолетних"
Здравствуйте, Аноним, Вы писали:
_FR>>А, то есть одна "высокоуровневая" функция (типа GetDataFromBD) у вас выбрасывает большую кучу разнородного "добра"? Да такую кучу, что вы сами не с состоянии за ней, кучей, уследить? Вам это, оказывается дорого? Дорого, получается, поддерживать то, что сами же и написали? Мдя.
_FR>>... бла-бла-бла остальное поскипано
Не нужно свои слова квотить как мои.
А> А>потрясающая способность в нескольких предложениях не оставить ни капли смысла.
Если ты не видишь смысла, это вовсе не значит, что его там нет. Судя по ответу топикстартера он-то смысл увидел, раз уж возразил.
А>критика как всегда
Ну так уж и всегда.
А>прет с невероятным апломбом, но по сути — ни капли информации.
Сформулируй "суть" в данном контексте. По сути было сказано, что "у вас бардак и начинать лечить нужно от него". И это не прозрачно. Хочется потролить — продолжай в том же духе.
А>попробуй иногда предлагать решения а не просто разносить в пух и прах "чтиво для несовершеннолетних"
Решение чего ты предлагаешь мне предложить? На стартовый вопрос я уже ответил. В этой ветке объяснил почему решение должно быть именно таким. Если ты не понял чего-то спроси конкретно что. Если понял — возражай более конкретно.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, 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.
Здравствуйте, _FRED_, Вы писали:
MC>>Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).
_FR>Это слишком просто. Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.
Можно просто дополнительно передавать params Type[] с типами исключений, которые надо хэндлить, и при которых нужно повторно пробовать. Это, возможно, может потребовать некоторой работы по приведению методов в нормальный вид, чтобы они выбрасывали только определенные, документированные типы исключений, а не все подряд. Что в принципе всегда полезно.
У нас что-то типа такого используется при работе с удаленным веб-сервисом — там где нужно ловим WebException и если поймали — делаем таймаут и повторяем вызов функции.
Здравствуйте, MozgC, Вы писали:
MC>>>Лично я бы лучше проверял не так: DateTime.UtcNow — startTime < timeOut, а задавал бы количество попыток и таймаут между попытками, допустим 3 попытки, между каждыми Thread.Sleep(TimeSpan.FromMinutes(1)).
_FR>>Это слишком просто. Надо подробно разбирать, что за исключение произошло, и в зависимости от этого принимать решение — ждать или нет и чего (сколько), как продолжать и т.п.
MC>Можно просто дополнительно передавать params Type[] с типами исключений, которые надо хэндлить, и при которых нужно повторно пробовать.
Это уже механика — как и что передавать и реализовать её можно большим набором инструментальных средств.
MC>Это, возможно, может потребовать некоторой работы по приведению методов в нормальный вид, чтобы они выбрасывали только определенные, документированные типы исключений, а не все подряд. Что в принципе всегда полезно. MC>У нас что-то типа такого используется при работе с удаленным веб-сервисом — там где нужно ловим WebException и если поймали — делаем таймаут и повторяем вызов функции.
Здравствуйте, 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.
Здравствуйте, _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 никуда не пропало.
Так что узнать причину неполадки — можно. Нужно ли ?
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль".
Основная проблема не в обработке, а в самой постановке задачи. Это примерно как из подводной лодки забомбарить танк, в надежде что он вдруг подъедет к берегу. Таким способом сделать "пуленепробиваемую программу" не получится.
Задача хочу залогировать любое исключение — имеет право на жизнь. Но вот повторить операцию потому что а вдруг по правильному шибанёт — в корне неверно. Операций которые могут повториться но уже с успехом — очень немного. Такие места можно определить исходя из контекста задачи. И адресно решать. Нужно решить где возможна ошибка. Что будем делать — останавливать программу, останавливать сценарий, или попробовать повторить. И вылавливать ситуации нужно не на уровне команды, а на уровне подпрограмм.