3

我想通過瀏覽器操作通過Chrome擴展程序打開一個窗口。爲什麼try..catch不能與chrome.windows.get一起使用?

var wid = null; 
chrome.windows.get(wid, function(chromeWin) { 
    chrome.windows.create({'url': 'https://google.com'}, function(chromeWin) { 
      wid = chromeWin.id; 
     } 
    ); 
}); 

,以防窗臺的多個副本,我想檢查窗口ID。但如果第一次使用,可以理解,它會引發錯誤,因爲widnull

Error: Invocation of form windows.get(null, function) doesn't match definition windows.get(integer windowId, optional object getInfo, function callback)

我試圖用try..catch塊和捕捉我處理「widnull」的情況。

try { 
    var wid = null; 
    chrome.windows.get(wid, function(chromeWin) { 
     chrome.windows.create({'url': 'https://google.com'}, function(chromeWin) { 
       wid = chromeWin.id; 
      } 
     ); 
    }); 
} 
catch(error) { 
    chrome.windows.create({'url': 'https://google.com'}, function(chromeWin) { 
      wid = chromeWin.id; 
     } 
    );  
} 

try..catch不捕 「widnull」 的情況。 我知道if子句可能有助於我的實驗,但我想知道爲什麼try表現如此。

爲什麼try..catch不緩存錯誤,以及如何在Chrome中打開沒有副本的窗口?

+0

1.您可以在調用函數之前檢查'null' **。您有兩個變量'wid'和'winId',因此代碼不完整或者您有拼寫錯誤。 – wOxxOm

+0

謝謝。這確實是錯字。如果子句有幫助,但會使代碼變得複雜。嘗試和趕上似乎是整潔的,但不知何故不適用於此代碼清單。 –

+0

代碼中沒有任何內容會阻止重複出現。 – Xan

回答

2

答案實際上將是相當無聊:它確實通過Chrome API進行調用驗證工作,因爲這種情況發生同步:

try { 
    var wid = null; 
    chrome.windows.get(wid, function(chromeWin) { 
    console.log("This should never be visible."); 
    }); 
} catch(e) { 
    console.log("Error caught!"); 
    console.warn(e); 
} 

這將捕獲錯誤(並顯示它作爲一個相反警告)。所以你原來的問題必須在其他地方(代碼的另一部分,而不是正確地重新加載代碼,類似的東西)。


我最初的觀點是在Chrome的異步處理過程中發生了一些錯誤。這是不是這個錯誤,而是與chrome.runtime.lastError報告的錯誤。如果您沒有檢查該值,並且出現錯誤,則會引發無法捕獲的異常,因爲它發生在原始調用之後並且在回調之外。

關於here的更多信息,但同樣不適用於您的情況。

相關問題