1. JavaScript / Говнокод #11708

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    try {
                        /**
                         * Нахожу номер "начисления" в массиве "charges" По соответствию поля "adapter".
                         */
                        _.each(currentEmployee.charges, function (charge, num) {
                            if (_.isEqual(charge.adapter, currentCharge.adapter)) {
                                throw num;
                            }
                        }, this);
                    } catch (num) {тут какой то код}

    Самый оригинальный спомоб выйти из цикла
    Используется underscore.js

    Запостил: nur, 05 Сентября 2012

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

    • Хм... А JS нормально относится к тому, что кинули не [наследника] Exception?
      Ответить
      • Если мне не изменяет память - то там так же как в c++ - кидай хоть числа.
        Ответить
    • Интересно, как оно по быстродействию, в сравнении с break; Ведь в JS всякое может быть.
      Ответить
    • for(var i=0; i<10; i++){
      		try {
      			// something...
      		} catch(e) {
      	}
      			console.log(e);
      		}

      , не?
      Ответить
      • не совсем.
        Тут try-catch используют как замену return, потому что кодер ниасилил организовать нормальный цикл вместо .each().
        Ответить
    • Ну а как иначе? Не знаю, как в underscore, но из родного forEach иначе не выйти.
      Ответить
      • return false в калбеке _.each прервёт перебор
        Ответить
        • Чуть чуть неверно
          // Establish the object that gets returned to break out of a loop iteration.
            var breaker = {};
          
          
          
          
          
           if (iterator.call(context, obj[key], key, obj) === breaker) return;
          Ответить
    • да хотябы так, найдет и индекс и значение. эксепшены на то и эксепшены потому что блять это исключительная ситуация. их применение оправданно лишь в той ситуации когда может возникнуть хуй знает что, например при работе с файловой системой, или весь код построен в такой манере что любая функция может что то выкинуть(не ваша библиотека например).
      Разработчик объяснил свой выбор, сославшись на более опытного python разработчика, он даже не подумал а для чего
      питонисты\node.js и тому подобные разрабы юзают эксепшены, на самом деле эксешены ловятся исключительно что бы не упал весь код, если где то вылетит ошибка то упадет весь сервер. а на клиенте использовать такой выход из цикла это пиздец, да и просто оборачивать код в try catch. для меня единственно оправданное применение try catch на клиенте это обертка всего кода, ловля исключения и отсылка в лог сообщения об ошибке, а не ради того чтоб некий код работал и иногда не падал

      var searchIndex = 0,
          sv = _.find(currentEmployee.charges, function (value, index) {
              if (_.isEqual(value.adapter, currentCharge.adapter)) {
                  searchIndex = index;
                  return true;
              } else {
                  return false;
              }
          });
      Ответить
      • В python для выхода из цикла используется выброс исключения StopIteration, который обычно ловит for (т.е. все итераторы так делают). Так питонщик поступил патриотично и идеоматично (для python, но не для js)
        Ответить

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