Здравствуйте, 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.
Здравствуйте, _FRED_, Вы писали:
_FR>Тогда в чём проблема в том, что бы ждать только тогда, когда неполадка сетевая
Таким образом мы сделали полный круг и вернулись к тому, что придется ЗАКЛАДЫВАТЬСЯ на ВСЕ исключения, которые могут быть вылечены повторением.
А их полно и возня эта будет очень трудоемка и дорогостояща. Да еще и непроста — и "File already exist" и "Path not found" — все равно IOException, только первое повтором не лечится, а шара может появиться.
P.S. Так и не понял — в чем ошибки моего проектирования, с которыми предлагалось разбираться ?
Здравствуйте, GlebZ, Вы писали:
N_P>>Из функции вылетают свои исключения вида "Не удалось осуществить операцию N" с InnerException сбоя. И группировка там не по причине, а по реакции "все пропало, зовите админа и читайте документацию" или "не принят логин\пароль". GZ>Основная проблема не в обработке, а в самой постановке задачи. Это примерно как из подводной лодки забомбарить танк, в надежде что он вдруг подъедет к берегу. Таким способом сделать "пуленепробиваемую программу" не получится. GZ>Задача хочу залогировать любое исключение — имеет право на жизнь. Но вот повторить операцию потому что а вдруг по правильному шибанёт — в корне неверно. Операций которые могут повториться но уже с успехом — очень немного. Такие места можно определить исходя из контекста задачи. И адресно решать. Нужно решить где возможна ошибка. Что будем делать — останавливать программу, останавливать сценарий, или попробовать повторить. И вылавливать ситуации нужно не на уровне команды, а на уровне подпрограмм.
Обработка ВСЕХ методов таким образом — это, конечно, бред. А вот 30-50 методов вида "получить данные из БД" — как раз и имеет смысл. Потому как обработка этой ситуации — однотипна. Другое дело, что правильно говорят — черно\белый список исключений надо всести — ну так это уже конкретная реализация.
U>Вроде писали библиотечку весьма квалифицированные люди, соответственно это шаманство по идее имеет смысл, но какой не знаю. Или все-таки Stopwatch можно использовать смело?
Авторы этой функции говорят, что на некоторых многопроцессорных системах Stopwatch работает неправильно.
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>Понадобилось тут сделать пуленепробиваемую программу. То есть — что-бы при пропадании сети и файловые операции и операции с базами данных не вываливались по ошибке, а пытались исполнится еще минуту.
N_P>Собственно, ЧТО делать — понятно — обернуть все нужное в try/catch со счетчиками и выдавать исключения вида "В течении минуты не удалось".
N_P>Не понятно — КАК делать. Поскольку таких операций много — оборачивать каждый File.Move, XmlDocument.Load и dbCommand.ExecuteReader и муторно и ведет к многим ошибкам, свойственным методу copy-paste. С базами данных еще проблема, что простейшие операции оборачивать нет смысла — там всю транзакцию надо обернуть, а такие сложные функции могут одна из другой вызываться.
N_P>Вообщем — подскажите, пожалуйста, есть ли какой способ универсально обернуть кучу функций в одинаковый код ?
Cделайте один класс, который выполняет некую операцию.. и логику при ее невыполнении (повторение операции, выход и т.д.)
В методе выполнения операции напихайте try и кучу нужных catch'ей
Под операцией я подражумеваю Запись в БД, Копирование файла, Звонок другу или что угодно, которую Вы инкапсулируете в отдельные классы.