2012-01-03 41 views
1

我写了一个userscript,并在Greasemonkey 0.9.13中运行它。不带try块的代码会抛出异常。但是用block,它不会

如果我删除的唯一try... catch块(行54-66),但保持里面的代码,它会抛出异常,如下图所示:

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

然而,剥离的脚本在Chrome运行良好的w/o任何问题。

但是,它会不是打印任何东西到控制台,这意味着在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); 
} 

回答

1

该脚本需要try块(因为你可以看到),因为for循环的逻辑是非常差(它通常会超支streamItems阵列和去除hidden-tweet类时可能有一个竞争条件)。

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

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

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

+0

好的,我确定'for'循环的结束条件,并且问题似乎是固定的。我深入研究,发现'div.stream-loading'元素可能是原因。但是,我不太明白为什么它可以在Chrome上运行?由于我忽略'div.stream-loading'的高度,因此它可能会在Chrome中破坏脚本。 – ayanamist 2012-01-03 19:31:16

+0

Chrome可能会立即报告变化的高度,因为代码看起来像是预期的那样,但FF中可能会有小的延迟。这是在twitter上测试的一个主要的痛苦(一个有很多FUBAR JS的视域),所以我在这里做了一个有根据的猜测。 – 2012-01-03 20:41:15

+0

这可能是原因。谢谢。 – ayanamist 2012-01-04 04:17:15

0

我们使用的try/catch赶上代码是在try块发生任何错误。根据您的要求,您可以决定是否要抑制消息(或)通过在catch块中添加一些代码来提醒用户。您可以添加一些警报并查看用于调试目的的消息。

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