我认为我在开发Chrome扩展程序之前就已经解决了这个问题,所以现在在例行维护期间,同样的问题似乎又出现了。
有人可以让我知道为什么这段代码:
try
{
chrome.tabs.get(nTabID, function(tab) //this is line 484 where the error happens
{
var tabUrl = '';
try
{
tabUrl = tab.url;
}
catch(e)
{
//Failed to get tab URL -- mute it
}
if(tabUrl)
{
//Process it
}
});
}
catch(e)
{
//Failed to get tab for 'nTabID' -- mute it
}
无法在控制台中防止此错误:
运行tabs.get时未选中runtime.lastError:没有ID为N的选项卡
答案 0 :(得分:-1)
发生这种情况是由于异步代码。这是一个副本,可以帮助您理解。以下是独立代码,因此您可以使用它来理解。取消注释以下每个错误将以不同方式触发异常。
// Mock of chrome.tabs.get, for illustration purposes
function chromeTabsGet(tabId, callback) {
// v----------------- This error will be caught
// throw Error();
setTimeout(() => {
// v------------- This error will not (just like the one you see)
throw Error()
callback({url: 2})
}, 0)
}
try
{
chromeTabsGet(0, function(tab) //this is line 484 where exception happens
{
var tabUrl = '';
try
{
tabUrl = tab.url;
}
catch(e)
{
// Failed to get tab URL -- mute it
}
if(tabUrl)
{
// Process it
}
});
}
catch(e)
{
// Failed to get tab for 'nTabID' -- mute it
}
如您所见,chrome.tabs.get
(此处图示为chromeTabsGet
)可以两种方式抛出。如果它扔在函数本身内部,那么您将在最外面的try-catch中立即捕获它。但是,如果该函数调度一个(或多个)异步事件,则这些事件将从主控制流中移出,置于事件循环队列中,并在以后调度。因此,它们不再在您的try-catch中运行,因为该代码已经完成执行。
解决此问题的一种方法是使用await
和async
而不是回调,但是浏览器尚不支持(可以在Node中或通过使用Babel来做到这一点)
按照@wOxxOm的建议,对于您的特定问题,请查看Unchecked runtime.lastError when using Chrome API
编辑:事实上,我对浏览器的知识有点过时了。 Most modern browsers do in fact support await
and async
,在您的情况下,您已经使用了chrome,因此效果很好。