-
vuk © (17.01.09 20:59) [152]
> А куда относится AV при форматировании сообщений системного > журнала? Эта ошибка не может быть исправлена программистом
Как это не может быть исправлена программистом - может быть исправлена программистом. Например, вылавливанием этого AV, пардон, протоколированием его, и продолжением разбора следующей части. Стандартная категория "ошибка в данных".
oxffff © (17.01.09 20:56) [150]
> А внешние ошибки воспринимать как данные - это заниматься > самообманом.
Что такое "внешняя ошибка" по твоей терминологии ?
-
>Игорь Шевченко © (17.01.09 21:36) [160] > Что такое "внешняя ошибка" по твоей терминологии ?
Эта ошибка природу, которой установить невозможно, все генерируемые ею исключения отсутствуют в общем словаре. Но тем не менее.
\\ Реакция на ошибку определяется не ее типом(данные, программист, внешняя), а критичностью компонента в котором она произошла, и возможностью отказаться от этого компонента вовсе(присваивание значения по умолчанию, игнорирование невозвращенного результата).
-
oxffff © (17.01.09 21:44) [161]
> Эта ошибка природу, которой установить невозможно
Не понял, поясни. Электричество кончилось - это внешняя ошибка ? Альфа-частица пролетела сквозь планку памяти и вызвала распад битов - это внешняя ошибка ?
> все генерируемые ею исключения отсутствуют в общем словаре
что такое "общий словарь" ?
-
> Игорь Шевченко © (17.01.09 21:36) [160] > vuk © (17.01.09 20:59) [152] > > > > А куда относится AV при форматировании сообщений системного > > > журнала? Эта ошибка не может быть исправлена программистом > > > Как это не может быть исправлена программистом - может быть > исправлена программистом. Например, вылавливанием этого > AV, пардон, протоколированием его, и продолжением разбора > следующей части.
А как вы собстенно узнате характер исключения, если это будет для внешнего исключения и если это не СBuilder
cDelphiException = $0EEDFADE; cNonDelphiException = $0EEDFAE4; cCppException = $0EEFFACE; { used by BCB }
По связке External Exception + GetlastError? Если Error Code - 5. :) А как сделать вывод куда рыть в общем случае?
А что есть еще потенциально опасные недокументированные исключения внешних компонент? Не считаете ли вы, что если ничего не известно, и нет 100% гарантии, но ее нужно обеспечить для оставшейся части приложения, то пустой except end - это решение вопроса?
-
to Игорь Шевченко © (17.01.09 21:36) [160]: >Как это не может быть исправлена программистом - может быть исправлена >программистом. Например, вылавливанием этого AV, пардон, >протоколированием его, и продолжением разбора следующей части. Может мы немного разошлись в терминологии, но как мне кажется, это не исправление, а обработка ошибки. Данные, они как были кривыми, так ими и останутся.
-
vuk © (17.01.09 22:12) [164]
> Может мы немного разошлись в терминологии, но как мне кажется, > это не исправление, а обработка ошибки. Данные, они как > были кривыми, так ими и останутся.
Да, конечно, обработка. Об исправлении данных речь в большинстве случаев не ведется, хотя встречаются и такие ситуации, где ошибочные данные могут быть исправлены. Но эта ошибка (с логом) аналогична той, что некто ввел в цифровое поле вместо 11234 значение 112ЗЧ (на мой такой простой взгляд)
oxffff © (17.01.09 22:04) [163]
> Не считаете ли вы, что если ничего не известно, и нет 100% > гарантии, но ее нужно обеспечить для оставшейся части приложения, > то пустой except end - это решение вопроса?
Извини, это пустой разговор. Я могу еще раз привести в пример систему Windows - при ошибке в режиме пользователя она выдает сообщение об ошибке и продолжает работать, а при ошибке в режиме ядра валится с синим экраном. Sapienti Sat
-
> Игорь Шевченко © (17.01.09 21:46) [162] > oxffff © (17.01.09 21:44) [161]
> > Эта ошибка природу, которой установить невозможно > > > Не понял, поясни. Электричество кончилось - это внешняя > ошибка ? Альфа-частица пролетела сквозь планку памяти и > вызвала распад битов - это внешняя ошибка ?
Ваши примеры некорректны, такого рода исключения вполне известны. Будут сгенерированы соответствующие исключания процессора, которые Delphi замапит через const ExceptMap в sysutils. Я говорю о EExternalException.
Но тем не менее работать дальше надо, может все таки пустой try except?
> > что такое "общий словарь" ?
Это все типы исключений и кодов возвратов, которые известны вашему приложению(т.е. вам). Не EExternalException, и не исключения delphi опеределенные во внешнем DLL.
-
> Игорь Шевченко © (17.01.09 22:25) [165] > Извини, это пустой разговор. Я могу еще раз привести в пример > систему Windows - при ошибке в режиме пользователя она выдает > сообщение об ошибке и продолжает работать, а при ошибке > в режиме ядра валится с синим экраном. > Sapienti Sat
Это и есть разные зоны ответственности компонентов. Одни внешние имеют общую с режимом ядра зону ответственности.
Вторые - приложения пользователя раздельные зоны ответственности с режимом ядра. Система просто не пропускает их далее уже за сам механизм SEH.
Как пустой разговор?
Есть конкретно постановка задачи [137]. Есть решение с пустым except end там же.
Насколько я понимаю вы не находите в этом решении ничего плохого? Если да, то тему можно наконец то завершить.
-
Про пустой try...except И почти с плагинами Есть некоторое приложение. Висит слушает сокет а при подключении клиента поднимает COM объект реализующий этот интерфейс и позволяет клиенту его использовать. Конечно он ничего не знает о таких объектах - "плагинах". Я так полагаю, его разработчики тоже подумали - мало ли кто будет плагины писать - давай подстрахуемся будем исключения гасить. Как результат имеем ситуацию (реальная) массовые сигналы от пользователей - НЕ РАБОТАЕТ. Смотрим машину - загрузка процессора 20% свободной памяти несколько гигов, в логе никаких ошибок интерфейс самого приложения показывает состояние нормальной рабочей нагрузки. Только НИЧЕГО не работает и нет НИКАКИХ признаков что это не работает (кроме пользователей которых несколько тысяч и у которых от работоспособности системы зависят их доходы). Программист конечно молодец - его программа работает. Что делать тем кто ее эксплуатирует? Круглосуточно сидеть на телефоне? Кстати перезапуск программы решает проблему. На некоторое время.
-
oxffff © (17.01.09 23:13) [167]
> Есть конкретно постановка задачи [137]. > Есть решение с пустым except end там же.
Это неграмотное решение, потому что в случае возникновения ошибки информация о ней пропадает и о причине можно только гадать.
-
> Sapienti Sat
Да, да, спагетии мудрому понятны.
-
> oxffff (17.01.2009 21:30:39) [159]
Мне ничего, но я не участвую в обсуждение, просто пару сообщений, по некоторым моментам, бросаю и всего лишь. Но наверняка есть люди более заинтересованые в обсуждение люди. Поскольку меня перевоспитывать поздно, для себя я все решил, ну немного за других обидно и всего.
-
oxffff © (17.01.09 23:13) [167]
> Это и есть разные зоны ответственности компонентов. > Одни внешние имеют общую с режимом ядра зону ответственности. > > > Вторые - приложения пользователя раздельные зоны ответственности > с режимом ядра. Система просто не пропускает их далее уже > за сам механизм SEH.
Речь не идет о механизмах, речь идет о парадигме. Мало ли где какие механизмы - парадигма одна - об ошибках надо информировать тем или иным способом, соответственно об ошибках в данных - произвольным путем, по выбору, об ошибках в программе - лучше всего громким треском. Плагины и прочие внешние компоненты целесообразно рассматривать как данные.
-
> Игорь Шевченко © (17.01.09 23:23) [169] > oxffff © (17.01.09 23:13) [167] > > > > Есть конкретно постановка задачи [137]. > > Есть решение с пустым except end там же. > > > Это неграмотное решение, потому что в случае возникновения > ошибки информация о ней пропадает и о причине можно только > гадать.
Почему неграмотное? Где аргументы?
Если исключение при выполнении самого задания, оно будет отловлено и будет выслан в логгер информация, однако если ислючение возникнет исключение в логере оно будет проглочено, позволив обработать другие задания(приложения пользователя в вашем пример).
Теперь вопрос вам, как вы не зная реализации логера и его природу(DLL) можете обработать его ошибки? И привидите грамотное с вашей точки зрения решение, сохранив условие задачи.
for task in Tasks do begin try try task.execute; except ExternalLoger.Inform('Task Error'); end; except end; end; Если
-
> Игорь Шевченко © (17.01.09 23:23) [169] > Это неграмотное решение, потому что в случае возникновения > ошибки информация о ней пропадает и о причине можно только > гадать. >
Не всегда есть необходимость изучать причину ошибки. Например, когда эти причины известны заранее, устранение их невозможно по каким-либо причинам, не зависящим от разработчика. Предположим, мне необходимо зажигать светодиодик при выполнении одного из трех условий. Условия генерируются тремя "черными ящиками", глючными до безобразия, а доступа у меня к ним нет ну никакого. Информация какой из них сглючил мне неважна - неглючных "черных ящиков" нету, замена не поможет. Остается лишь махнуть на них рукой, и в случае возникновения очередной ошибки просто проигнорировать ее.
-
> Sergey Masloff (17.01.09 23:21) [168] >Игорь Шевченко © (17.01.09 23:26) [172]
Если ваше логирование встало(и вам известны причины поскольку известна реализация), у вас что есть второй журнал в который будет занесена информация о сбое логирования. А если он за сбоит? Есть Третий журнал?
Вопрос вы обертываете логирование в SEH или нет? Или позволяете рухнуть приложению при крахе логирования?
Я еще раз повторяю логирование внешнее. Нет никакого внутреннего логирования поскольку:
1. Логирование внешнее. 2. Отлавливаемые исключения неизвестны
Теперь я бы хотел получить более информативное разъяснение о неграмотном решении. А лучше с примером. Слова свои нужно подтверждать. :)
-
oxffff © (17.01.09 23:31) [173]
> Теперь вопрос вам, как вы не зная реализации логера и его > природу(DLL) можете обработать его ошибки? > И привидите грамотное с вашей точки зрения решение, сохранив > условие задачи.
Для меня недостаточно условий для приведения решения задачи, но в твоем коде я вижу два недостатка:
первый: если в методе task.execute возникнет исключение, то информация будет только о факте ошибки вообще. второй: если в методе task.execute возникнет исключение и в методе ExternalLogger.Inform возникнет исключение, то информации даже о факте ошибки не будет.
Кому нужна такая программа - я не в курсе.
-
KilkennyCat © (17.01.09 23:36) [174]
> Например, когда эти причины известны заранее, устранение > их невозможно по каким-либо причинам, не зависящим от разработчика. > Предположим, мне необходимо зажигать светодиодик при выполнении > одного из трех условий. Условия генерируются тремя "черными > ящиками", глючными до безобразия, а доступа у меня к ним > нет ну никакого. Информация какой из них сглючил мне неважна > - неглючных "черных ящиков" нету, замена не поможет. Остается > лишь махнуть на них рукой, и в случае возникновения очередной > ошибки просто проигнорировать ее.
На этот случай придуман оператор if :)
-
oxffff © (17.01.09 23:40) [175] Журнал один. Не удалось в него писать - рушимся.
Я описал ситуацию в которой из-за того что программист предпочел все втихую прятать возникают гигантские проблемы у пользователей. Если бы оно просто подыхало я поставил бы гуарда который хоть раз в 20 секунд проверял живо ли оно и если нет перезапускал бы. Хотя в данном случае и этого бы не нужно так как оно может работать как сервис я бы средствами винды поставил после ошибки перестарт и забыл бы.
-
> Игорь Шевченко © (17.01.09 23:26) [172] > oxffff © (17.01.09 23:13) [167] > Речь не идет о механизмах, речь идет о парадигме. Мало ли > где какие механизмы - парадигма одна - об ошибках надо информировать > тем или иным способом, соответственно об ошибках в данных > - произвольным путем, по выбору, об ошибках в программе > - лучше всего громким треском. > Плагины и прочие внешние компоненты целесообразно рассматривать > как данные.
Дык весь вопрос в том, что информацию пользователю попадает через логирование, которое в данном случае внешнее. Как быть если оно киркнулось, как сообшить пользователю о сбое. Можно попробовать так. Суть не меняется.
try try try task.execute; except ExternalLoger.Inform('Task Error'); end; except ExternalLoger.Inform('Logger crash); end; except end;
У вас нет возможности сообщить пользователю о сбое логера. Пользователь видет только свой лог.
|