Код без блока try выдаст исключение. Но с блоком это не будет - PullRequest
1 голос
/ 03 января 2012

Я написал usercript и запустил его в Greasemonkey 0.9.13.

Если я удаляю единственный блок try... catch (строка 54-66), но сохраняю код внутри него, он выдаст исключения, как показано ниже:

необработанное исключение: [Исключение ... Код "Операция не поддерживается": Результат "9": расположение "0x80530009 (NS_ERROR_DOM_NOT_SUPPORTED_ERR)": "resource: //greasemonkey/runScript.js Строка: 29"]

Однако раздетые скрипты хорошо работают в Chrome без каких-либо проблем.

Однако, он будет НЕ печатать что-либо в консоли, что означает, что коды в блоке try не выдают исключение, если заключены в блок try.

Ребята, скажите, почему это работает?

Это фрагмент кода из этого связанного источника :

var streamItems = $('div.main-content div.stream-item');
var streamItemsLength = streamItems.length;
var innerHeight = window.innerHeight;
var scrollY = window.scrollY;
var y = scrollY + innerHeight;
var tweet;
var tweetHeight = 0;
try {
  for (var sumHeight = getHeaderHeight(), num = 0; sumHeight < y; num++, sumHeight += tweetHeight) {
    tweet = streamItems[num];
    tweetHeight = getHeight(tweet);
    if (tweetHeight == 0) {
      removeClass(tweet, 'hidden-tweet');
      tweetHeight = getHeight(tweet);
    }
  }
}
catch (e) {
  console.log(e.stack);
}

Ответы [ 2 ]

1 голос
/ 03 января 2012

Этот сценарий нуждается в блоке try (как вы можете видеть), поскольку логика цикла for очень плохая (он часто заполняет массив streamItems и, вероятно, имеет состояние гонки при удалении hidden-tweet класс).

Вы говорите, что в Chrome нет исключений, но похоже, что это просто случайность. При правильных условиях он также может потерпеть неудачу в Chrome - или, может быть, манипуляции с узлами Chrome достаточно разные. Неважно, код плохой.

Что касается того, что он ничего не выводит на консоль, вы уверены? Это в моих тестах.

Но иногда между оболочками анонимных функций и прослушивателями событий ошибка stack может показаться пустой.

0 голосов
/ 03 января 2012

Мы используем try / catch для обнаружения любых ошибок, произошедших в коде, который находится в блоке try. На основании ваших требований вы можете решить, хотите ли вы подавить сообщение (или) предупредить пользователя, добавив некоторый код в блоке catch. Вы можете добавить предупреждение и увидеть сообщение для вашей цели отладки.

Судя по сообщению об исключении, кажется, что вы выполняете операцию (вызов метода / функции) для объекта DOM, который не поддерживается, вам необходимо пересмотреть код и убедиться, что выполняемые вами вызовы функций поддерживаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...