我写了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);
}
答案 0 :(得分:1)
该脚本需要try
块(如您所见),因为for
循环的逻辑非常差(它经常会超出streamItems
数组并且可能会有竞争删除hidden-tweet
类时的条件。
你说它不会在Chrome中引发异常,但看起来这只是偶然事件。在适当的条件下,它也应该在Chrome中失败 - 或者Chrome的节点操作可能就足够了。没关系,代码很差。
至于它没有在控制台上打印任何东西,你确定吗?它在我的测试中确实。
但有时在匿名函数包装器和事件侦听器之间,错误stack
可能看起来是空的。
答案 1 :(得分:0)
我们使用try / catch来捕获try块中代码中发生的任何错误。根据您的要求,您可以通过在catch块中添加一些代码来决定是否要禁止消息(或)警告用户。您可以添加一些警报并查看消息以进行调试。
基于异常消息,您似乎正在对DOM对象执行不受支持的操作(方法/函数调用),您需要重新访问代码并查看您正在进行的函数调用是否受支持。