使用 Chrome API 时未选中 runtime.lastError

Unchecked runtime.lastError when using Chrome API

我在我的应用程序中使用 chrome.fileSystem API 打开文件。当我单击文件选择器对话框的 Cancel 按钮时,发生错误:

Unchecked runtime.lastError while running fileSystem.chooseEntry: User cancelled

如何解决这个错误?

这个错误在这种情况下并不重要,但我会解释它以及如何摆脱它。

这是什么错误?

Chrome APIs 大部分是异步的:您有一个回调,在操作完成时调用。

chrome.fileSystem.chooseEntry 的情况下,所选条目(或多个条目)将传递给回调:

chrome.fileSystem.chooseEntry(
  {/* options */},
  function(entry) {
    // This is the callback for the API call; you can do something with entry
  }
);

但是,API 并不保证 产生结果。例如,在您的情况下,用户可以通过单击“取消”拒绝提供访问权限。然后就没有可以使用的条目,您可能需要一些解释来解释为什么会这样。如何在不使用额外的“错误”参数污染所有回调的情况下引发错误?

通常,Chrome 通过在调用回调时设置全局变量 chrome.runtime.lastError 来处理此问题。 在 Chrome async API 中统一使用它而不是错误参数。 事实上,引用 chrome.fileSystem 文档:

All failures are notified via chrome.runtime.lastError.

  • 如果一切顺利,那就是undefined
  • 如果有问题,会是非空的,chrome.runtime.lastError.message会说明错在哪里。

但是,一些回调没有检查这个错误变量。这可能表示编程错误,并且 Chrome 添加了检查 chrome.runtime.lastError 在回调中实际检查(评估)的检查。如果不是,它认为这是一个未处理的异常,并抛出这个错误。

为什么我说不重要?

虽然这是一个错误,但不会中断程序的执行(在异步任务结束时抛出),也不会真正显示给用户。

虽然我说这不重要,但您应该检查程序的逻辑。这可能是正确的,也可能不是正确的 - 这是一个(严厉的)警告。

为什么会存在?

警告,,开发者,你的代码可能试图使用不存在的结果,因为有些事情发生了错了。

您可能已经在检查错误,例如

if (entry) {
  // Process entry
} else {
  // Something went wrong (but what?)
}

Chrome 不使用复杂的启发式方法来查看您的代码是否期望这种可能性。如前所述,错误是通过 chrome.runtime.lastError 报告的,您需要检查它。

请注意,此错误仅在 确实 发生错误时才会出现,而不会在 API 调用正常完成时出现。

能抓到吗?

不是真的;它不是由您的代码引发的,而是 Chrome API 中处理异步任务的清理代码;因此在回调中使用 try ... catch 无济于事。由于它是异步的,因此在原始 API 调用周围使用 try 也无济于事。

怎么办?

您应该向回调中添加逻辑,以按照 Chrome 预期的方式检查问题,并可能对其作出反应。

function(entry) {
  if(chrome.runtime.lastError) {
    // Something went wrong
    console.warn("Whoops.. " + chrome.runtime.lastError.message);
    // Maybe explain that to the user too?
  } else {
    // No errors, you can use entry
  }
}

只要Chrome看到你checked这个值有错误的时候(也就是在你的回调里面求值),这个错误就不会抛出。

聚会迟到了,但这是我在 chrome.windows.remove() 调用中抑制错误的方法,以防它对其他人有所帮助。而不是

chrome.windows.remove(foo);  // unconditional; runtime.lastError not checked

我用过

chrome.windows.remove(
        foo,
        function ignore_error() { void chrome.runtime.lastError; }
);

void 计算其操作数,然后 returns undefined。我认为这段代码相当有效地证明了它的目的是忽略错误 :) .

为简洁起见,ignore_error() 可以从该调用中拉出并用于多个 chrome API 调用,或者可以省略名称 ignore_error

Update 在 ES6 中,你可以使用更短的 arrow function 语法:

chrome.windows.remove( foo, ()=>void chrome.runtime.lastError );

测试 Chrome 64

对于此类错误,try catch 将无济于事。相反,您可以访问全局变量 chrome.runtime.lastError,正如@xan 在他上面的精彩回复中提到的那样(顺便说一下,您应该阅读它并投票!)。

现在,我在这里提供一个可以使用的例子:

function catchLastError(){
  if(chrome.runtime.lastError){
    console.log("error: ", chrome.runtime.lastError);
  }else{
    // some code goes here.
  }
}

chrome.fileSystem.chooseEntry(yourEntry,catchLastError);

此错误与每个 的某些 google chrome 扩展有关。我禁用了所有扩展,错误消失了。在对他们每个人进行了更多的尝试之后,我发现自然 Reader 文本到语音扩展是导致它的原因。很有可能是您的扩展造成了这种情况。祝你好运。

只是为了分享我的案例;

删除该行后错误消失;

res.end()

来自 nodejs 应用程序上的 http headers