为什么try..catch不能与chrome.windows.get一起使用?

4

我正在尝试通过浏览器操作打开一个窗口的Chrome扩展程序。

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

为了避免出现多个窗口的副本,我正在尝试检查窗口ID。但是如果第一次使用,可以理解的是,它会抛出错误,因为widnull

错误:调用表单windows.get(null,function)与定义windows.get(integer windowId,optional object getInfo,function callback)不匹配

我尝试使用try..catch块,在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没有捕获"wid is null"的情况。我知道if语句对我的实验可能有帮助,但我想了解为什么try会表现出这种方式。
为什么try..catch没有捕获错误,如何在Chrome中打开窗口而不复制?

  1. 在调用函数之前,您可以检查是否为null
  2. 您有两个变量widwinId,因此代码可能不完整或存在拼写错误。
- wOxxOm
谢谢。确实是打错了。if语句可以帮助,但会使代码变得复杂。尝试使用try和catch似乎很整洁,但在这个代码清单中不起作用。 - Nico Neill
你的代码中没有任何阻止出现重复的东西。 - Xan
好的,现在我读了你的问题,它确实有意义。我已经编辑了一下以突出/修复拼写错误,点赞并准备回答。 - Xan
1个回答

3
实际上,答案可能会有些无聊: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报告的错误。如果您没有检查该值,并且存在错误,则会引发异常,无法捕获它,因为它发生在原始调用之后并且在回调之外。
更多信息请参见此处,但是在您的情况下不适用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接