Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
 
  • Sergey Masloff (17.01.09 12:05) [80]
    oxffff ©   (17.01.09 11:59) [77]
    Я все понял. Программа не работает но внешне все хорошо. Повторяю спасибо, мне слышать больше ни о чем не надо.
  • oxffff © (17.01.09 12:13) [81]

    > Sergey Masloff   (17.01.09 12:05) [80]


    Ты внимательно смотрел код?
    Это код кода отдельного потока, который запускает неизвестное ему задание, и логирует неизвестно куда.
  • oxffff © (17.01.09 12:36) [82]

    > Повторяю спасибо, мне слышать больше ни о чем не надо.


    Мне жаль что ты совершенно не внимательно прочитал мои посты.

    Вот упрощенный код общего запуска и логирования.

    procedure DoTask(const Task:ITask;const Log:ILog);
    begin
    try
    Log.Inform('Task Start');
    except
    end;
    try
      try
      Task.Start;
      except
         try
         Task.TryToCloseTask;
         except
         end;
      Log.Inform('Task Error');
      raise;
      end;

      try
      Log.Inform('Task End');
      except
      end;
    except
    end;
    end;
  • test (17.01.09 12:44) [83]
    oxffff ©   (17.01.09 12:36) [82]
    Что будет если Log.Inform('Task Start'); свалиться в ошибку, а потом  Task.TryToCloseTask;. Память бесконечно, как и процессорное время?
  • oxffff © (17.01.09 12:53) [84]

    > test   (17.01.09 12:44) [83]
    > oxffff ©   (17.01.09 12:36) [82]
    > Что будет если Log.Inform('Task Start'); свалиться в ошибку,
    >  а потом  Task.TryToCloseTask;. Память бесконечно, как и
    > процессорное время?


    Этот вопрос нужно не мне задавать, а тому кто будет писать Log и Task.
    В этом коде не видно, однако и Log и Task будут разрушены тоже безопасностно.
    Задача это кода гарантровать работостопосбность центрального приложения, которое запускает неизвестное задание и пишет в неизвестный лог.
    Что касается возможных потерь внутри кода Log и Task - это вопросы к его разработчику.
  • Игорь Шевченко © (17.01.09 13:10) [85]
    test   (17.01.09 08:40) [72]


    > Не обязательно вылетать, часть ошибок можно обработать.


    Есть два вида ошибок - ошибки из-за неверных данных и ошибки алгоритма.

    Первые надо обрабатывать (возможно), о вторых надо как можно громче сообщать.
    То есть, для примера, если кто-то ввел вместо 11234 112ЗЧ то это стоит обработать и позволить ввести верное значение.
    А если в результате действий программиста произошло обращение к неинициализированному указателю, то стоит вылететь с максимально громким треском.
  • Anatoly Podgoretsky © (17.01.09 13:25) [86]
    > Sergey Masloff  (17.01.2009 11:53:16)  [76]

    Намекаешь на http://www.podgoretsky.com/OtherParts/DM/BadWill.aspx пукт 4?
  • oxffff © (17.01.09 13:40) [87]

    > Anatoly Podgoretsky ©   (17.01.09 13:25) [86]
    > > Sergey Masloff  (17.01.2009 11:53:16)  [76]
    >
    > Намекаешь на http://www.podgoretsky.com/OtherParts/DM/BadWill.
    > aspx пукт 4?


    Есть глубокая уверенность, что и вы тоже не внимательно прочитали мои посты.  
    Специально для Вас:

    Если нет 100% уверенности, что внешний код не может генерировать исключение(ввиду  ошибки его автора и природа этих ошибок не известна),
    то необходимо создавать максимально robust центральное приложение устойчивое к такого рода воздействиям.
    Если рассуждать по вашему.
    То есть например плагин 3D max, который сгенерировал неизвестное исключение, что теперь вся среда должна киркнуться? Так по вашему?

    P.S. Я предлагаю добавить еще один пункт в ваши вредные заветы первым.  

    Оказание вредных советов без понимания сути.
    Наказание: на кол.
  • oxffff © (17.01.09 13:43) [88]
    > Anatoly Podgoretsky ©   (17.01.09 13:25) [86]
    > > Sergey Masloff  (17.01.2009 11:53:16)  [76]

    Есть зоны ответственности за исключение.
  • oxffff © (17.01.09 13:47) [89]

    > oxffff ©   (17.01.09 13:43) [88]
    > > Anatoly Podgoretsky ©   (17.01.09 13:25) [86]
    > > > Sergey Masloff  (17.01.2009 11:53:16)  [76]
    >
    > Есть зоны ответственности за исключение.


    А это означает, что на определенных уровнях все неизвестные исключения должны "проглатываться", чтобы не нарушить функциональность вызывающей части.
  • Anatoly Podgoretsky © (17.01.09 13:51) [90]
    > oxffff  (17.01.2009 13:40:27)  [87]

    Создание robust приложений и пустые except end - как бы не связаны или наоборот.
  • Anatoly Podgoretsky © (17.01.09 13:53) [91]
    > oxffff  (17.01.2009 13:47:29)  [89]

    Ну и как это связано с пустой/не пустой try except. По твоим словам вытекает, что только пустой проглотит, а не пустой нет. Даже вывод диалога в try except не влияет на это, отлично проглатывается. Эти критерии не подходят, найди что ни будь другое.
  • oxffff © (17.01.09 13:56) [92]

    > Anatoly Podgoretsky ©   (17.01.09 13:51) [90]


    Не внимательно читали?

    Если нет 100% уверенности, что внешний код не может генерировать исключение(ввиду  ошибки его автора и природа этих ошибок не известна),
    то необходимо создавать максимально robust центральное приложение устойчивое к такого рода воздействиям.

    Поэтому есть [88] с пояснением [89].

    Я жду ваш ответ про плагины к средам.
  • oxffff © (17.01.09 14:04) [93]

    > Anatoly Podgoretsky ©   (17.01.09 13:53) [91]
    > > oxffff  (17.01.2009 13:47:29)  [89]
    >
    > Ну и как это связано с пустой/не пустой try except. По твоим
    > словам вытекает, что только пустой проглотит, а не пустой
    > нет. Даже вывод диалога в try except не влияет на это, отлично
    > проглатывается. Эти критерии не подходят, найди что ни будь
    > другое.


    Покажите мне код, который обрабатывает неизвестное исключение.

    Рассмотрим пример [82]. Есть необходимость запускать что-то и логировать куда-то. И там и там есть потенциальное уязвимое место.
    Поэтому есть зона ответственности по приоритетам.

    1. логика центрального приложения
    2. Логика запуска внешнего задания
    3. Логика логирования.

    Если мы не защитим 3, мы нарушим 2. что недопустимо.

    Поэтому

    try
    Log.Inform('Task Start');
    except
    end;

    Ошибка логирования не должна не позволить запустить задание.
    Если мы не защитим 2, мы нарушим 1, что недопустимо.
    Если мы пропустим за

    except
    end;
    end;

    Мы нарушим логику центрального приложения.
  • Anatoly Podgoretsky © (17.01.09 14:10) [94]

    > Покажите мне код, который обрабатывает неизвестное исключение.

    except
      on E: Exception do ErrorDialog(E.Message, E.HelpContext);
    end;

  • oxffff © (17.01.09 14:22) [95]

    > Anatoly Podgoretsky ©   (17.01.09 14:10) [94]
    >
    > > Покажите мне код, который обрабатывает неизвестное исключение.
    >
    >
    > except
    >   on E: Exception do ErrorDialog(E.Message, E.HelpContext);
    >
    > end;


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

    +дополнительный вопрос.
    А где гарантии что ErrorDialog сам не вызовет исключение, нарушив логику?

    Давайте я поясню работу этого приложения.
    Есть центральное приложение, которое отслеживает изменения в файловой системе. На определенные фильтры изменений настроен запуск задачи с ее логированием. И задача и логирование предоставлется плагином DLL.
    Пришли определенные файлики из SAP R3 запускается задачи с логированием в потоке - закачка данных в Oracle, MSSQL, foxpro, Аcesss.
  • oxffff © (17.01.09 14:22) [96]

    > Anatoly Podgoretsky ©   (17.01.09 14:10) [94]


    Где ответ на

    >Я жду ваш ответ про плагины к средам.
  • Anatoly Podgoretsky © (17.01.09 15:20) [97]
    > oxffff  (17.01.2009 14:22:35)  [95]

    Не уходи от темы, тебе нужна была обработка любого, заранее неизвестного исключения, теперь ты придераешься к форме.
    Не нравится ErrorDialog замени на ErrorLog или на что хочешь, на твое любимое.
  • Юрий Зотов © (17.01.09 15:35) [98]
    "если в программе ошибка, то пусть она вылетает с максимально громким треском" (с) [70]

    Конечно, здесь Игорь имел в виду ошибку программы, а не юзера.

    И этим все сказано. Других аргументов не требуется. А если кто в этом сомневается, то перестанет сомневаться как только ему "дадут на сопровождение прогу которая писалась 5 лет назад с пустыми исключениями" (с) [72].

    Молчаливое гашение ошибок программы - ОЧЕНЬ дурной стиль. Возможно, что действительно (хотя и крайне редко) встречаются ситуации, когда на это все же приходится идти, но в каждом конкретном случае обязательно нужно проанализировать, почему такая ситуация возникла и приложить максимум усилий для того, чтобы ее избежать. Вплоть до перепроектирования кода.

    И это вовсе никакая не догма, а суровая правда жизни. Если прыгнуть с 20-го этажа, то разобьешься (хотя мизерный шанс все же есть). Все об этом знают и не прыгают. И догмой не называют.

    Но спор бессмысленен. Потому что это спор тех, кто уже успел понабивать шишек с теми, кто еще понабивал их недостаточно. И пока не понабивают достаточно, все равно не поймут.
  • Игорь Шевченко © (17.01.09 15:48) [99]
    Юрий Зотов ©   (17.01.09 15:35) [98]

    Я в [85] раскрыл тему :)
 
Конференция "Прочее" » Тем, кто утверждает, что тело except не должно быть пустым
Есть новые Нет новых   [134453   +32][b:0.001][p:0.001]