2012-01-03 79 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對象執行操作(方法/函數調用),您需要重新訪問代碼並查看您正在執行的函數調用是否受支持。