Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
 
  • Игорь Шевченко © (17.01.09 21:36) [160]
    vuk ©   (17.01.09 20:59) [152]


    > А куда относится AV при форматировании сообщений системного
    > журнала? Эта ошибка не может быть исправлена программистом


    Как это не может быть исправлена программистом - может быть исправлена программистом. Например, вылавливанием этого AV, пардон, протоколированием его, и продолжением разбора следующей части.
    Стандартная категория "ошибка в данных".

    oxffff ©   (17.01.09 20:56) [150]


    > А внешние ошибки воспринимать как данные - это заниматься
    > самообманом.


    Что такое "внешняя ошибка" по твоей терминологии ?
  • oxffff © (17.01.09 21:44) [161]

    >Игорь Шевченко ©   (17.01.09 21:36) [160]
    > Что такое "внешняя ошибка" по твоей терминологии ?


    Эта ошибка природу, которой установить невозможно, все генерируемые ею исключения отсутствуют в общем словаре. Но тем не менее.

    \\
    Реакция на ошибку определяется не ее типом(данные, программист, внешняя), а критичностью компонента в котором она произошла, и возможностью отказаться от этого компонента вовсе(присваивание значения по умолчанию, игнорирование невозвращенного результата).
  • Игорь Шевченко © (17.01.09 21:46) [162]
    oxffff ©   (17.01.09 21:44) [161]


    > Эта ошибка природу, которой установить невозможно


    Не понял, поясни. Электричество кончилось - это внешняя ошибка ? Альфа-частица пролетела сквозь планку памяти и вызвала распад битов - это внешняя ошибка ?


    > все генерируемые ею исключения отсутствуют в общем словаре


    что такое "общий словарь" ?
  • oxffff © (17.01.09 22:04) [163]

    > Игорь Шевченко ©   (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 - это решение вопроса?
  • vuk © (17.01.09 22:12) [164]
    to Игорь Шевченко ©   (17.01.09 21:36) [160]:
    >Как это не может быть исправлена программистом - может быть исправлена
    >программистом. Например, вылавливанием этого AV, пардон,
    >протоколированием его, и продолжением разбора следующей части.
    Может мы немного разошлись в терминологии, но как мне кажется, это не исправление, а обработка ошибки. Данные, они как были кривыми, так ими и останутся.
  • Игорь Шевченко © (17.01.09 22:25) [165]
    vuk ©   (17.01.09 22:12) [164]


    > Может мы немного разошлись в терминологии, но как мне кажется,
    >  это не исправление, а обработка ошибки. Данные, они как
    > были кривыми, так ими и останутся.


    Да, конечно, обработка. Об исправлении данных речь в большинстве случаев не ведется, хотя встречаются и такие ситуации, где ошибочные данные могут быть исправлены. Но эта ошибка (с логом) аналогична той, что некто ввел в цифровое поле вместо 11234 значение 112ЗЧ (на мой такой простой взгляд)

    oxffff ©   (17.01.09 22:04) [163]


    > Не считаете ли вы, что если ничего не известно, и нет 100%
    > гарантии, но ее нужно обеспечить для оставшейся части приложения,
    >  то пустой except end - это решение вопроса?


    Извини, это пустой разговор. Я могу еще раз привести в пример систему Windows - при ошибке в режиме пользователя она выдает сообщение об ошибке и продолжает работать, а при ошибке в режиме ядра валится с синим экраном.
    Sapienti Sat
  • oxffff © (17.01.09 22:57) [166]

    > Игорь Шевченко ©   (17.01.09 21:46) [162]
    > oxffff ©   (17.01.09 21:44) [161]


    > > Эта ошибка природу, которой установить невозможно
    >
    >
    > Не понял, поясни. Электричество кончилось - это внешняя
    > ошибка ? Альфа-частица пролетела сквозь планку памяти и
    > вызвала распад битов - это внешняя ошибка ?


    Ваши примеры некорректны, такого рода исключения вполне известны. Будут сгенерированы соответствующие исключания процессора, которые Delphi замапит через const ExceptMap в sysutils.
    Я говорю о EExternalException.

    Но тем не менее работать дальше надо, может все таки пустой try except?


    >
    > что такое "общий словарь" ?


    Это все типы исключений и кодов возвратов, которые известны вашему приложению(т.е. вам). Не EExternalException, и не исключения delphi опеределенные во внешнем DLL.
  • oxffff © (17.01.09 23:13) [167]

    > Игорь Шевченко ©   (17.01.09 22:25) [165]
    > Извини, это пустой разговор. Я могу еще раз привести в пример
    > систему Windows - при ошибке в режиме пользователя она выдает
    > сообщение об ошибке и продолжает работать, а при ошибке
    > в режиме ядра валится с синим экраном.
    > Sapienti Sat


    Это и есть разные зоны ответственности компонентов.
    Одни внешние имеют общую с  режимом ядра зону ответственности.

    Вторые - приложения пользователя раздельные зоны ответственности с режимом ядра. Система просто не пропускает их далее уже за сам механизм SEH.

    Как пустой разговор?

    Есть конкретно постановка задачи [137].
    Есть решение с пустым except end там же.

    Насколько я понимаю вы не находите в этом решении ничего плохого?
    Если да, то тему можно наконец то завершить.
  • Sergey Masloff (17.01.09 23:21) [168]
    Про пустой try...except  И почти с плагинами
    Есть некоторое приложение. Висит слушает сокет а при подключении клиента поднимает COM объект реализующий этот интерфейс и позволяет клиенту его использовать. Конечно он ничего не знает о таких объектах - "плагинах". Я так полагаю, его разработчики тоже подумали - мало ли кто будет плагины писать - давай подстрахуемся будем исключения гасить.
     Как результат имеем ситуацию (реальная) массовые сигналы от пользователей - НЕ РАБОТАЕТ. Смотрим машину - загрузка процессора 20% свободной памяти несколько гигов, в логе никаких ошибок интерфейс самого приложения показывает состояние нормальной рабочей нагрузки. Только НИЧЕГО не работает и нет НИКАКИХ признаков что это не работает (кроме пользователей которых несколько тысяч и у которых от работоспособности системы зависят их доходы).
     Программист конечно молодец - его программа работает. Что делать тем кто ее эксплуатирует? Круглосуточно сидеть на телефоне?
     Кстати перезапуск программы решает проблему. На некоторое время.
  • Игорь Шевченко © (17.01.09 23:23) [169]
    oxffff ©   (17.01.09 23:13) [167]


    > Есть конкретно постановка задачи [137].
    > Есть решение с пустым except end там же.


    Это неграмотное решение, потому что в случае возникновения ошибки информация о ней пропадает и о причине можно только гадать.
  • oxffff © (17.01.09 23:24) [170]

    > Sapienti Sat


    Да, да, спагетии мудрому понятны.
  • Anatoly Podgoretsky © (17.01.09 23:25) [171]
    > oxffff  (17.01.2009 21:30:39)  [159]

    Мне ничего, но я не участвую в обсуждение, просто пару сообщений, по некоторым моментам, бросаю и всего лишь. Но наверняка есть люди более заинтересованые в обсуждение люди. Поскольку меня перевоспитывать поздно, для себя я все решил, ну немного за других обидно и всего.
  • Игорь Шевченко © (17.01.09 23:26) [172]
    oxffff ©   (17.01.09 23:13) [167]


    > Это и есть разные зоны ответственности компонентов.
    > Одни внешние имеют общую с  режимом ядра зону ответственности.
    >
    >
    > Вторые - приложения пользователя раздельные зоны ответственности
    > с режимом ядра. Система просто не пропускает их далее уже
    > за сам механизм SEH.


    Речь не идет о механизмах, речь идет о парадигме. Мало ли где какие механизмы - парадигма одна - об ошибках надо информировать тем или иным способом, соответственно об ошибках в данных - произвольным путем, по выбору, об ошибках в программе - лучше всего громким треском.
    Плагины и прочие внешние компоненты целесообразно рассматривать как данные.
  • oxffff © (17.01.09 23:31) [173]

    > Игорь Шевченко ©   (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;
    Если
  • KilkennyCat © (17.01.09 23:36) [174]

    > Игорь Шевченко ©   (17.01.09 23:23) [169]
    > Это неграмотное решение, потому что в случае возникновения
    > ошибки информация о ней пропадает и о причине можно только
    > гадать.
    >


    Не всегда есть необходимость изучать причину ошибки. Например, когда эти причины известны заранее, устранение их невозможно по каким-либо причинам, не зависящим от разработчика. Предположим, мне необходимо зажигать светодиодик при выполнении одного из трех условий. Условия генерируются тремя "черными ящиками", глючными до безобразия, а доступа у меня к ним нет ну никакого. Информация какой из них сглючил мне неважна - неглючных "черных ящиков" нету, замена не поможет. Остается лишь махнуть на них рукой, и в случае возникновения очередной ошибки просто проигнорировать ее.
  • oxffff © (17.01.09 23:40) [175]

    > Sergey Masloff   (17.01.09 23:21) [168]
    >Игорь Шевченко ©   (17.01.09 23:26) [172]


    Если ваше логирование встало(и вам известны причины поскольку известна реализация), у вас что есть второй журнал в который будет занесена информация о сбое логирования. А если он за сбоит? Есть Третий журнал?

    Вопрос вы обертываете логирование в SEH или нет?
    Или позволяете рухнуть приложению при крахе логирования?

    Я еще раз повторяю логирование внешнее.
    Нет никакого внутреннего логирования поскольку:

    1. Логирование внешнее.
    2. Отлавливаемые исключения неизвестны

    Теперь я бы хотел получить более информативное разъяснение о неграмотном решении. А лучше с примером.
    Слова свои нужно подтверждать. :)
  • Игорь Шевченко © (17.01.09 23:43) [176]
    oxffff ©   (17.01.09 23:31) [173]


    > Теперь вопрос вам, как вы не зная реализации логера и его
    > природу(DLL) можете обработать его ошибки?
    > И привидите грамотное с вашей точки зрения решение, сохранив
    > условие задачи.


    Для меня недостаточно условий для приведения решения задачи, но в твоем коде я вижу два недостатка:

    первый: если в методе task.execute возникнет исключение, то информация будет только о факте ошибки вообще.
    второй: если в методе task.execute возникнет исключение и в методе ExternalLogger.Inform возникнет исключение, то информации даже о факте ошибки не будет.

    Кому нужна такая программа - я не в курсе.
  • Игорь Шевченко © (17.01.09 23:44) [177]
    KilkennyCat ©   (17.01.09 23:36) [174]


    > Например, когда эти причины известны заранее, устранение
    > их невозможно по каким-либо причинам, не зависящим от разработчика.
    >  Предположим, мне необходимо зажигать светодиодик при выполнении
    > одного из трех условий. Условия генерируются тремя "черными
    > ящиками", глючными до безобразия, а доступа у меня к ним
    > нет ну никакого. Информация какой из них сглючил мне неважна
    > - неглючных "черных ящиков" нету, замена не поможет. Остается
    > лишь махнуть на них рукой, и в случае возникновения очередной
    > ошибки просто проигнорировать ее.


    На этот случай придуман оператор if :)
  • Sergey Masloff (17.01.09 23:47) [178]
    oxffff ©   (17.01.09 23:40) [175]
    Журнал один. Не удалось в него писать - рушимся.

     Я описал ситуацию в которой из-за того что программист предпочел все втихую прятать возникают гигантские проблемы у пользователей.
     Если бы оно просто подыхало я поставил бы гуарда который хоть раз в 20 секунд проверял живо ли оно и если нет перезапускал бы. Хотя в данном случае и этого бы не нужно так как оно может работать как сервис я бы средствами винды поставил после ошибки перестарт и забыл бы.
  • oxffff © (17.01.09 23:48) [179]

    > Игорь Шевченко ©   (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;

    У вас нет возможности сообщить пользователю о сбое логера. Пользователь видет только свой лог.
 
Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
Есть новые Нет новых   [134453   +31][b:0.001][p:0.001]