1. C# / Говнокод #11527

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    while (true)
    {
        try
        {
            ProductService.Invoke(method);
            return; 
        }
        catch(Exception ex)
        {
            if (ex is System.ServiceModel.CommunicationException)
            {
                if (currentRetryCount == RetryCount)
                        throw new CommunicationException(CommunicationFailureMessage, ex);
                    System.Threading.Thread.Sleep(RetryWait);
                    currentRetryCount++;
            }
        }
    }

    Запостил: abatishchev, 03 Августа 2012

    Комментарии (10) RSS

    • Ну так, по мелочи можно придраться. Но фатального говна в коде не вижу.
      Зациклить может, если регулярно не тот эксепшон лезет. Но неизвестно что там вообще может вылезать.
      Ответить
      • catch(CommunicationException ex) не?
        Ответить
        • в т.ч.

          а главное - почти самый гавёный анти-паттерн из анти-паттернов
          Ответить
    • некритичное говно. если конечно протокол коммуникации стэйтлесс.

      напомнило другое говно: у народа в проге соединение с базой рвалось постоянно, потому что фаервол говёный стоял у клиента в сети. клиент дурак настоял (и за это заплатил) что бы в коде сделали простой реконнект к базе. наши дураки (клиент (с деньгами) всегда прав!) это сделали. более или менее в первый же день у клиента случилось логичное: разрыв соединения в середине транзакции. и цирк начался...
      Ответить
      • Тут самое главное то, что теряются все остальные ошибки кроме той, которая обрабатывается. Какой-нибудь NPE просто проигнорируется, и никто не узнает что именно произошло. Например, ProductService не существует, и получили бесконечный цикл. Тем более там что-то через рефлекшн вызывается - а это всегда чревато.
        Ответить
        • верю, верю. просмотрел.
          Ответить
        • кстати, да. любое исключение кроме CommunicationException вызывает бесконечный цикл
          Ответить
        • > Например, ProductService не существует, и получили бесконечный цикл
          Вы смотрите на проблему не под тем углом.
          >бесконечный цикл
          Вот это конечно хуёво, но это может запускаться в треде с таймаутом.
          Я лично такой код видел (наверняка оно до сих пор так и работает).
          Но там было одно небольшое, но существенное отличие: по ThreadInterruptedException вываливаливался дальше.

          Но! Данный код также может выйти из цикла если прерывание произойдет во время System.Threading.Thread.Sleep(RetryWait) , например.
          Ответить
    • exception-driven-development, твою за ногу.
      Ответить

    Добавить комментарий