Javascript 如何防止runtime.lastError错误消息出现在控制台中?
我想我以前在开发Chrome扩展时处理过这个问题,所以现在在日常维护过程中,同样的问题似乎又出现了 有人能告诉我为什么这段代码: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 {
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的一个内部机制。问题是我为什么不能捕获异常。上下文无关。我的回答给出了一个无法捕捉异常的例子。这当然是一个有趣的方法:基于上下文之外的词语进行回答。