Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
 
  • Германн © (18.01.09 02:18) [200]

    > Существует категория людей, спорить с которыми не нужно.

    Вот это точно. Бо они заточены именно на споры. Суть спора их не очень волнует.
  • Eraser © (18.01.09 02:41) [201]
    > [137] oxffff ©   (17.01.09 20:33)

    подобные ошибки должны логироваться централизованно, а не на местах, с пом. спец. средств, например JCL. все исключения, кроме ряда специализированных (например в Indy некоторые исключения сигнализируют далеко не об ошибке) нужно логировать. не обработанные исключения тоже нужно логировать, но при этом сообщая через UI о том, что произошла ошибка.
  • oxffff © (18.01.09 02:47) [202]
    Удалено модератором
  • oxffff © (18.01.09 02:57) [203]

    > Eraser ©   (18.01.09 02:41) [201]
    > > [137] oxffff ©   (17.01.09 20:33)
    >
    > подобные ошибки должны логироваться централизованно, а не
    > на местах, с пом. спец. средств, например JCL. все исключения,
    >  кроме ряда специализированных (например в Indy некоторые
    > исключения сигнализируют далеко не об ошибке) нужно логировать.
    >  не обработанные исключения тоже нужно логировать, но при
    > этом сообщая через UI о том, что произошла ошибка.


    Это generic алгоритм, который испоняется на отдельной тачке без GUI с возможным падением логгера и единственной возможностью сообщить только через него. Такова поставновка задачи.
    С ограниченной фукнциональностью контрактов. Такова поставновка задачи.
    Естественно я приводил данный упрощенный код для выявления потребности в пустом except end. А в итоге мы уже далеко отошли от этого.
    Оппонент по факту признался в невозможности решения в [181].
    Однако официально не признает этого.
    Мог бы получить союзника, а так получат опонента пожизненно.
  • Eraser © (18.01.09 03:15) [204]
    > Это generic алгоритм, который испоняется на отдельной тачке
    > без GUI с возможным падением логгера и единственной возможностью
    > сообщить только через него. Такова поставновка задачи.

    так ответили же уже - записывать в системный журнал. если и при этом ошибка, можно записывать в самопальный лог, ввиде текстового файла. если и там ошибка - генерировать не обрабатываемое исключение, либо закрывать поиложение с определенным кодом ошибки.
  • test (18.01.09 06:38) [205]
    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;
  • test (18.01.09 06:42) [206]
    on e:Exception do MessageDlg(e.message,mtError,[mbOK],0);
    Можно менять на что угодно, но информация о том что произошла ошибка должна быть, хочеш тут завершай приклад, хочеш пиши самопальный лог.
    Да еще вопросик а почему ты информацию о задании в лог не пишешь?
    Как потом из всего множества заданий искать тот в котором произошла ошибка?
  • oxffff © (18.01.09 11:19) [207]

    >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% уверенности что в том, что это он не сделает нет. Тем более на машине на которой никто не сидит и не видит этих сообщений.
    (Рано или поздно кончатся ресурсы)
    Это не параноидальный подход.
    Это когда нужно гарантировать выполнение следующих заданий, опять же по условию задачи.
  • oxffff © (18.01.09 11:22) [208]

    > Да еще вопросик а почему ты информацию о задании в лог не
    > пишешь?
    > Как потом из всего множества заданий искать тот в котором
    > произошла ошибка?


    Ответ простой. Получить это информацию о задании нет возможности, есть только возожность ее выполнить. Таков контракт по заданию.

    Во первых все информацию о работе (в том числе и о ислючениях)паралельно может писать Task внутри свой внешней реализации, которая нам не доступна. Почему то никто до этого не смог догадаться.
    Но может также и не писать. Это вопрос реалиазции Task.
  • oxffff © (18.01.09 11:25) [209]

    > on e:Exception do MessageDlg(e.message,mtError,[mbOK],0);
    >
    > написать
    > MessageDlg(ExceptObject.message,mtError,[mbOK],0);


    Здесь звиняй, не прав я. ExceptObject тип Tobject.
  • oxffff © (18.01.09 11:30) [210]

    > oxffff ©   (18.01.09 11:25) [209]


    Однако писать для обработки всех исключений
    on e:Exception do MessageDlg(e.message,mtError,[mbOK],0);
    некорректно.
    Поскольку никто не запрещает нам например сделать
    raise Tform1.create(nil);
  • vuk © (18.01.09 11:59) [211]
    to oxffff ©   (18.01.09 11:19) [207]:
    >Все сообщения пользователя идут только ILOG(в задании сказано
    >логирование у yнас только внешнее). У нас нет никаких внутренних
    >журналов.
    >Это принципильный вопрос ребята.
    Я уже здесь писал, что догматизм вреден. В том числе в той форме, когда в ущерб возможности понимания того, что есть проблемы (о которых можно сообщить в системном журнале) начинается бессмысленное упирание в крувую постановку задачи.
  • oxffff © (18.01.09 13:43) [212]
    Удалено модератором
    Примечание: Предупреждаю: еще один переход на личности - будешь забанен. Надоело твою грязь чистить.
  • Anatoly Podgoretsky © (18.01.09 13:44) [213]
    > 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;


  • Anatoly Podgoretsky © (18.01.09 14:00) [214]
    > oxffff  (18.01.2009 13:43:32)  [212]

    Зачем приписываешь свои мысли другим.
    Ты уже начал кидаться на участников, оскорблять их.
    Чувствую ветка доживает свои последнии часы.
  • oxffff © (18.01.09 14:01) [215]

    > 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]  внимательно пожалуйста на слова обобщенный алгоритм, спасибо.
  • Petr V. Abramov © (18.01.09 14:04) [216]

    > oxffff ©   (18.01.09 13:43) [212]
    > Учитесь думать обобщенно. А я вам в этом помогу.

    не надо :)))

    вот смотри: у тебя есть некий плагин, который может свалиться даже на записи своих ошибок, житейская вещь. если это происходит, в самом фиговом случае мы видим чистый лог и полное отсутствие результатов работы плагина. Админ будет чесать репу очень долго и поминать тебя плохими словами.
    Чтобы этого не было, неплохо завести лог ошибок логгирования, в реализации простой, как три копейки. Плагины - не твое твое творчество, с т.з. системы им доверять нельзя, в них может происходить что угодно по опеределнию. Но и при его работе могут возникнуть исключения (диск переполнился). Можно, конечно, завести еще один уровень, который будет писать в журнал, над ним еще, который будет писать письмо путину и т.д. Не здОрово.
    можно гасить исключения, приходим к тому, от чего ушли, но с меньшими вероятностями.
    Выход можно содрать у оракловых утилит: в настройках указаывается, на какой по счету ошибке обработки им с треском сваливаться. Т.е. в нашем случае если, например, плагин 100 раз вызвал ошибку и не смог ее записать в лог, и мы в своем логе не можем ее отразить, потому что диск вылетел, этот плагин явно надо срубать, ничего хорошего от него не выйдет сегодня.
    А число 100 пусть подбирает админ.
  • oxffff © (18.01.09 14:11) [217]

    > oxffff ©   (18.01.09 13:43) [212]
    > Удалено модератором
    > Примечание: Предупреждаю: еще один переход на личности -
    >  будешь забанен. Надоело твою грязь чистить.


    Хорошо я напишу, корректней.  

    Есть обобщенней алгоритм:

    Есть неизвестное задание А, и неизвестный логер B. Согласно обобщенного алгоритма при возникновенеии исключение
    в А, должно быть сообщено в B. Однако исключение в B не должно рушить приложение. А и B генерируют неизвестные, внешние исключения, т.е. это будет экземпляр EExternalException.

    Любое сообщение пользователю должно идти через B(ILogger), таким образом предложения писать в системный лог идут в разрез в самой идеей генерализации. Фактически в таком случае нужно вообще отказаться от идеи генерализации логирования.
  • oxffff © (18.01.09 14:12) [218]

    >
    > Petr V. Abramov ©   (18.01.09 14:04) [216]


    Славо богу хоть ты успел прочитать.
  • oxffff © (18.01.09 14:26) [219]

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