没有try块的代码会抛出异常。但是有了块,它不会

时间:2012-01-03 18:25:30

标签: firefox greasemonkey userscripts

我写了userscript,并在Greasemonkey 0.9.13中运行。

如果我删除唯一的try... catch块(第54-66行)但保留其中的代码,它将抛出如下所示的异常:

  

未捕获的异常:[例外...“不支持操作”代码:   “9”nsresult:“0x80530009(NS_ERROR_DOM_NOT_SUPPORTED_ERR)”位置:   “resource://greasemonkey/runScript.js Line:29”]

但是,剥离的脚本在Chrome中运行良好,没有任何问题。

但是, NOT 会将任何内容打印到控制台中,这意味着如果try块包装,try块中的代码不会抛出异常。

你能告诉我它为什么有用吗?

这是linked source的代码段:

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 个答案:

答案 0 :(得分:1)

该脚本需要try块(如您所见),因为for循环的逻辑非常差(它经常会超出streamItems数组并且可能会有竞争删除hidden-tweet类时的条件。

你说它不会在Chrome中引发异常,但看起来这只是偶然事件。在适当的条件下,它也应该在Chrome中失败 - 或者Chrome的节点操作可能就足够了。没关系,代码很差。

至于它没有在控制台上打印任何东西,你确定吗?它在我的测试中确实。

但有时在匿名函数包装器和事件侦听器之间,错误stack可能看起来是空的。

答案 1 :(得分:0)

我们使用try / catch来捕获try块中代码中发生的任何错误。根据您的要求,您可以通过在catch块中添加一些代码来决定是否要禁止消息(或)警告用户。您可以添加一些警报并查看消息以进行调试。

基于异常消息,您似乎正在对DOM对象执行不受支持的操作(方法/函数调用),您需要重新访问代码并查看您正在进行的函数调用是否受支持。