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

Javascript 如何防止runtime.lastError错误消息出现在控制台中?,javascript,google-chrome,google-chrome-extension,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 {

我想我以前在开发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
    }
无法在控制台中防止此错误:

运行选项卡时未选中runtime.lastError。获取:没有ID为N的选项卡


这是因为异步代码。这是一个可以帮助你理解的回复。下面是独立的代码,因此您可以使用它来理解。取消对下面每个错误的注释将以不同的方式触发异常

// 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中运行,因为该代码已经执行完毕

解决这个问题的一种方法是使用wait和async而不是回调,但浏览器不支持它,但可以在Node中或通过使用Babel来实现

正如@wOxxOm所建议的,对于您的特定问题,请查看


编辑:事实上,我的浏览器知识有点过时了,在你的情况下,你已经使用了Chrome,所以你很好。

错误消息是误导的,因为它是由C++开发者编写的:您只需访问回调中的chrome.runtime.lastError,请参阅@wOxxOm:谢谢。我试试看。但这是处理异常的一种非常奇怪的方式。我只是好奇,C++是如何进入这里的?你不应该用ActualChrome API方法使用Test.catch。而不是这样,检查方法回调中的Chrim.RunTime.LaSTError。C++程序员可能实现了扩展API,他们显然认为错误消息是足够的自我解释的。对于了解内部结构的人来说可能是这样。这个答案在这里不适用,因为问题不是一个异常。描述中使用了一个不正确的术语,而是上面链接的重复主题中解释的chrome extensions API的一个内部机制。问题是我为什么不能捕获异常。上下文无关。我的回答给出了一个无法捕捉异常的例子。这当然是一个有趣的方法:基于上下文之外的词语进行回答。