如何防止runtime.lastError错误消息出现在控制台中?

时间:2019-04-09 09:31:37

标签: javascript google-chrome google-chrome-extension

我认为我在开发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
    }

无法在控制台中防止此错误:

enter image description here

  

运行tabs.get时未选中runtime.lastError:没有ID为N的选项卡

1 个答案:

答案 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中运行,因为该代码已经完成执行。

解决此问题的一种方法是使用awaitasync而不是回调,但是浏览器尚不支持(可以在Node中或通过使用Babel来做到这一点)

按照@wOxxOm的建议,对于您的特定问题,请查看Unchecked runtime.lastError when using Chrome API

编辑:事实上,我对浏览器的知识有点过时了。 Most modern browsers do in fact support await and async,在您的情况下,您已经使用了chrome,因此效果很好。