Re[14]: Массовая обертка функций
От: _FRED_ Черногория
Дата: 10.03.10 12:14
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

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

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

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

_FR>>

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

_FR>>а то
_FR>>

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

_FR>>

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

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

N_P>Не понимаю, что не понятно ?


Вопрос я кажется задал вполне конкретный.

N_P>Из метода вылетают исключения, группированные по реакции. Одни исключения ловятся и юзер принимает о них меры. А вот другие...


Ага, таки метод как-то умеет группировать исключения на "пользовательские" и "не пользовательские"? Или как-то гибче? К какой группе относятся сетевые ошибки?

N_P>Программе и юзеру в большинстве случаев — абсолютно пофигу почему именно программа не может продолжать работу в сетевой директории.


Как это "пофиг"? На счёт пользоватя не знаю, а вот программе, если в случае ошибки она хочет подождать чего-то или повторить какое-то действие должно быть не "пофиг". Иначе программа будет заниматься глупостями вроде попыток остучаться туда, где нету прав, а могла бы предупредить об этом и попросить дать права. А пользователь будет видеть, что программа чего-то ждёт и ничем не сможет помочь, хотя мог бы [позвонить админу и попросить вернуть правей]. В каких-то случаях действительно нужно просто ещё раз попытаться, но сразу, а в каких-то после того, как немного подождёшь.

N_P>То ли сервер удаленный выключен то ли диск из него выдернули то ли директорию снесли. И я не вижу никаких причин все эти проблемы анализировать.


А причин, по которым имеет смысл минуту ждать или десять раз пытаться простучаться, пока сервер включат, видишь?

N_P>"Неустранимая ошибка в работе, данные спасены насколько можно, в лог причина записана — зовите админа". Пусть смотрит что там написано, InnerException никуда не пропало.

N_P>Так что узнать причину неполадки — можно.

Тогда в чём проблема в том, что бы ждать только тогда, когда неполадка сетевая

N_P>Нужно ли ?


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

_FR>Тогда в чём проблема в том, что бы ждать только тогда, когда неполадка сетевая


Таким образом мы сделали полный круг и вернулись к тому, что придется ЗАКЛАДЫВАТЬСЯ на ВСЕ исключения, которые могут быть вылечены повторением.
А их полно и возня эта будет очень трудоемка и дорогостояща. Да еще и непроста — и "File already exist" и "Path not found" — все равно IOException, только первое повтором не лечится, а шара может появиться.

P.S. Так и не понял — в чем ошибки моего проектирования, с которыми предлагалось разбираться ?
Re[13]: Массовая обертка функций
От: Nikolay_P_I  
Дата: 10.03.10 13:17
Оценка:
Здравствуйте, GlebZ, Вы писали:

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

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

Обработка ВСЕХ методов таким образом — это, конечно, бред. А вот 30-50 методов вида "получить данные из БД" — как раз и имеет смысл. Потому как обработка этой ситуации — однотипна. Другое дело, что правильно говорят — черно\белый список исключений надо всести — ну так это уже конкретная реализация.
Re[5]: Массовая обертка функций
От: Undying Россия  
Дата: 18.03.10 04:44
Оценка:
Здравствуйте, Undying, Вы писали:

U>
U>        public TimeSpan Elapsed
U>        {
U>            get 
U>            {
U>                if (Math.Abs(innerWatch.Elapsed.Ticks - (DateTime.UtcNow - startUTC).Ticks) < 160000)
U>                  return innerWatch.Elapsed;
U>                else
U>                  return (DateTime.UtcNow - startUTC);
U>            }
U>        }
U>


U>Вроде писали библиотечку весьма квалифицированные люди, соответственно это шаманство по идее имеет смысл, но какой не знаю. Или все-таки Stopwatch можно использовать смело?


Авторы этой функции говорят, что на некоторых многопроцессорных системах Stopwatch работает неправильно.
Re: Массовая обертка функций
От: mrjeka Россия  
Дата: 18.03.10 07:58
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

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


N_P>Собственно, ЧТО делать — понятно — обернуть все нужное в try/catch со счетчиками и выдавать исключения вида "В течении минуты не удалось".


N_P>Не понятно — КАК делать. Поскольку таких операций много — оборачивать каждый File.Move, XmlDocument.Load и dbCommand.ExecuteReader и муторно и ведет к многим ошибкам, свойственным методу copy-paste. С базами данных еще проблема, что простейшие операции оборачивать нет смысла — там всю транзакцию надо обернуть, а такие сложные функции могут одна из другой вызываться.


N_P>Вообщем — подскажите, пожалуйста, есть ли какой способ универсально обернуть кучу функций в одинаковый код ?


Cделайте один класс, который выполняет некую операцию.. и логику при ее невыполнении (повторение операции, выход и т.д.)

В методе выполнения операции напихайте try и кучу нужных catch'ей
Под операцией я подражумеваю Запись в БД, Копирование файла, Звонок другу или что угодно, которую Вы инкапсулируете в отдельные классы.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.