-
> Существует категория людей, спорить с которыми не нужно.
Вот это точно. Бо они заточены именно на споры. Суть спора их не очень волнует.
-
> [137] oxffff © (17.01.09 20:33)
подобные ошибки должны логироваться централизованно, а не на местах, с пом. спец. средств, например JCL. все исключения, кроме ряда специализированных (например в Indy некоторые исключения сигнализируют далеко не об ошибке) нужно логировать. не обработанные исключения тоже нужно логировать, но при этом сообщая через UI о том, что произошла ошибка.
-
Удалено модератором
-
> Eraser © (18.01.09 02:41) [201] > > [137] oxffff © (17.01.09 20:33) > > подобные ошибки должны логироваться централизованно, а не > на местах, с пом. спец. средств, например JCL. все исключения, > кроме ряда специализированных (например в Indy некоторые > исключения сигнализируют далеко не об ошибке) нужно логировать. > не обработанные исключения тоже нужно логировать, но при > этом сообщая через UI о том, что произошла ошибка.
Это generic алгоритм, который испоняется на отдельной тачке без GUI с возможным падением логгера и единственной возможностью сообщить только через него. Такова поставновка задачи. С ограниченной фукнциональностью контрактов. Такова поставновка задачи. Естественно я приводил данный упрощенный код для выявления потребности в пустом except end. А в итоге мы уже далеко отошли от этого. Оппонент по факту признался в невозможности решения в [181]. Однако официально не признает этого. Мог бы получить союзника, а так получат опонента пожизненно.
-
> Это generic алгоритм, который испоняется на отдельной тачке > без GUI с возможным падением логгера и единственной возможностью > сообщить только через него. Такова поставновка задачи.
так ответили же уже - записывать в системный журнал. если и при этом ошибка, можно записывать в самопальный лог, ввиде текстового файла. если и там ошибка - генерировать не обрабатываемое исключение, либо закрывать поиложение с определенным кодом ошибки.
-
procedure DoTask(const Task:ITask;const Log:ILog); begin try Log.Inform('Task Start'); Task.Start; Log.Inform('Task End'); except try Task.TryToCloseTask; except try Log.Inform('Task close Error'); except on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); end; end; try Log.Inform('Task Error'); except on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); end; end; end;
-
on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); Можно менять на что угодно, но информация о том что произошла ошибка должна быть, хочеш тут завершай приклад, хочеш пиши самопальный лог. Да еще вопросик а почему ты информацию о задании в лог не пишешь? Как потом из всего множества заданий искать тот в котором произошла ошибка?
-
>Eraser © (18.01.09 03:15) [204] > test (18.01.09 06:38) [205]
Почему мы опять игнорируем пункт задания. Все сообщения пользователя идут только ILOG(в задании сказано логирование у yнас только внешнее). У нас нет никаких внутренних журналов. Это принципильный вопрос ребята.
Теперь конкретно по реалиазции не связанныго с моим заданием test (18.01.09 06:38) [205]
try Log.Inform('Task Start'); Task.Start; Log.Inform('Task End');
except try Task.TryToCloseTask; except try Log.Inform('Task close Error'); except on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); end; end;
try Log.Inform('Task Error'); except on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); end; end;
Любое исключение в Log.Inform('Task Start')| Task.Start;| Log.Inform('Task приведет к Task.TryToCloseTask, Log.Inform('Task Error'). Что некорректно. + как следствие дизинфоромация пользователя.
Теперь по оформлению, если не классификации исключений (обрабатываюстя все исключения) достаточно вместо on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); написать MessageDlg(ExceptObject.message,mtError,[mbOK],0);
Теперь главный вопрос почему сделано предположение о том, что сам MessageDlg(e.message,mtError,[mbOK],0); не вызовет исключение? Ведь 100% уверенности что в том, что это он не сделает нет. Тем более на машине на которой никто не сидит и не видит этих сообщений. (Рано или поздно кончатся ресурсы) Это не параноидальный подход. Это когда нужно гарантировать выполнение следующих заданий, опять же по условию задачи.
-
> Да еще вопросик а почему ты информацию о задании в лог не > пишешь? > Как потом из всего множества заданий искать тот в котором > произошла ошибка?
Ответ простой. Получить это информацию о задании нет возможности, есть только возожность ее выполнить. Таков контракт по заданию.
Во первых все информацию о работе (в том числе и о ислючениях)паралельно может писать Task внутри свой внешней реализации, которая нам не доступна. Почему то никто до этого не смог догадаться. Но может также и не писать. Это вопрос реалиазции Task.
-
> on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); > > написать > MessageDlg(ExceptObject.message,mtError,[mbOK],0);
Здесь звиняй, не прав я. ExceptObject тип Tobject.
-
> oxffff © (18.01.09 11:25) [209]
Однако писать для обработки всех исключений on e:Exception do MessageDlg(e.message,mtError,[mbOK],0); некорректно. Поскольку никто не запрещает нам например сделать raise Tform1.create(nil);
-
to oxffff © (18.01.09 11:19) [207]: >Все сообщения пользователя идут только ILOG(в задании сказано >логирование у yнас только внешнее). У нас нет никаких внутренних >журналов. >Это принципильный вопрос ребята. Я уже здесь писал, что догматизм вреден. В том числе в той форме, когда в ущерб возможности понимания того, что есть проблемы (о которых можно сообщить в системном журнале) начинается бессмысленное упирание в крувую постановку задачи.
-
Удалено модератором Примечание: Предупреждаю: еще один переход на личности - будешь забанен. Надоело твою грязь чистить.
-
> oxffff (17.01.2009 23:59:03) [183]> except > ErrorInfo:='Task Unknown Error'; > end; Я уже тебе приводил правильный код, не надо прятать реальную ошибку. Пользователь будет очень рад подобному жизнерадостному сообщению.
except
on E:Exception do
ErrorInfo:= 'Task Unknown Error: ' + E.Message;
end;
-
> oxffff (18.01.2009 13:43:32) [212]
Зачем приписываешь свои мысли другим. Ты уже начал кидаться на участников, оскорблять их. Чувствую ветка доживает свои последнии часы.
-
> Anatoly Podgoretsky © (18.01.09 13:44) [213]
Неправильно. А как насчет raise Tform.create(nil), не с корнем в Exception?
> Я уже тебе приводил правильный код, не надо прятать реальную > ошибку. Пользователь будет очень рад подобному жизнерадостному > сообщению. > > except > on E:Exception do > ErrorInfo:= 'Task Unknown Error: ' + E.Message; > end;
Для уже написал, что исключение внешение. У вас будет только Message='External Exception'.
Опять додумываете. Куда вы бутите слать его логер дает исключение? cм. [212] внимательно пожалуйста на слова обобщенный алгоритм, спасибо.
-
> oxffff © (18.01.09 13:43) [212] > Учитесь думать обобщенно. А я вам в этом помогу.
не надо :)))
вот смотри: у тебя есть некий плагин, который может свалиться даже на записи своих ошибок, житейская вещь. если это происходит, в самом фиговом случае мы видим чистый лог и полное отсутствие результатов работы плагина. Админ будет чесать репу очень долго и поминать тебя плохими словами. Чтобы этого не было, неплохо завести лог ошибок логгирования, в реализации простой, как три копейки. Плагины - не твое твое творчество, с т.з. системы им доверять нельзя, в них может происходить что угодно по опеределнию. Но и при его работе могут возникнуть исключения (диск переполнился). Можно, конечно, завести еще один уровень, который будет писать в журнал, над ним еще, который будет писать письмо путину и т.д. Не здОрово. можно гасить исключения, приходим к тому, от чего ушли, но с меньшими вероятностями. Выход можно содрать у оракловых утилит: в настройках указаывается, на какой по счету ошибке обработки им с треском сваливаться. Т.е. в нашем случае если, например, плагин 100 раз вызвал ошибку и не смог ее записать в лог, и мы в своем логе не можем ее отразить, потому что диск вылетел, этот плагин явно надо срубать, ничего хорошего от него не выйдет сегодня. А число 100 пусть подбирает админ.
-
> oxffff © (18.01.09 13:43) [212] > Удалено модератором > Примечание: Предупреждаю: еще один переход на личности - > будешь забанен. Надоело твою грязь чистить.
Хорошо я напишу, корректней.
Есть обобщенней алгоритм:
Есть неизвестное задание А, и неизвестный логер B. Согласно обобщенного алгоритма при возникновенеии исключение в А, должно быть сообщено в B. Однако исключение в B не должно рушить приложение. А и B генерируют неизвестные, внешние исключения, т.е. это будет экземпляр EExternalException.
Любое сообщение пользователю должно идти через B(ILogger), таким образом предложения писать в системный лог идут в разрез в самой идеей генерализации. Фактически в таком случае нужно вообще отказаться от идеи генерализации логирования.
-
> > Petr V. Abramov © (18.01.09 14:04) [216]
Славо богу хоть ты успел прочитать.
-
> Petr V. Abramov © (18.01.09 14:04) [216] > > > oxffff © (18.01.09 13:43) [212] > > Учитесь думать обобщенно. А я вам в этом помогу. > > не надо :))) > > вот смотри: у тебя есть некий плагин, который может свалиться > даже на записи своих ошибок, житейская вещь. если это происходит, > в самом фиговом случае мы видим чистый лог и полное отсутствие > результатов работы плагина. Админ будет чесать репу очень > долго и поминать тебя плохими словами. > Чтобы этого не было, неплохо завести лог ошибок логгирования, > в реализации простой, как три копейки. Плагины - не твое > твое творчество, с т.з. системы им доверять нельзя, в них > может происходить что угодно по опеределнию. Но и при его > работе могут возникнуть исключения (диск переполнился). > Можно, конечно, завести еще один уровень, который будет > писать в журнал, над ним еще, который будет писать письмо > путину и т.д. Не здОрово.
Плагины это как пример использования идеи генерализации. Я намеренно упросил задачу, для выявления пустого except end
Можно например представаить код который выполняется в дополнительном потоке, с его логированием. Можно например представаить работа с СУБД в дополнительном потоке, с его логированием. Возможности получить описания исключения нет(упрощено, можно делегировать этот контракт ITask в качестве решения, но не в этом суть). Важно!!! Что любое логирование идет через обобщенный контракт.
Вот здесь [216] ты намеренно пытаешься уйди о идеи генерализации. Ты предлагаешь завязаться на конкретном варианте логирования(фактически расширив его и специализировав). То есть хорошо давай предположим, что есть то я бы предложил в твоей версии
Есть генерализация
(IAbstractTask, IAbstractLogger, IAbstractLoggerOfLoggeerErrors).
Ты предлагаешь сузить генерализацию до
(ITask, ILogger, ConcreteWin32SystemEvent).
фактически ограничив ее, что противоречит условию задачи. Алгоритм должен быть обобщен. Однако и в том и в другом случае нет возможности гарантировать не защитив Logger, что за него уйдет исключение. Я надеюсь ты меня понял.
|