javascript - 使用 Chrome API 时未检查runtime.lastError

标签 javascript google-chrome-extension google-chrome-app

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

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

如何修复这个错误?

最佳答案

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

这个错误是什么?

Chrome API 大多是异步的:操作完成时会调用一个回调。

如果是 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 异步 API 中统一使用此参数而不是错误参数。事实上,引用 chrome.fileSystem 文档:

All failures are notified via chrome.runtime.lastError.

  • 如果一切正常,它将是未定义
  • 如果出现问题,它将非空,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 也无济于事。

如何处理它?<​​/strong>

您应该向回调添加逻辑,以 Chrome 期望的方式检查问题,并可能对其使用react。

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 发现您在出现错误时检查了该值(即在回调中对其进行了计算),就不会抛出该错误。

关于javascript - 使用 Chrome API 时未检查runtime.lastError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28431505/

相关文章:

javascript - 后台脚本的 sendResponse 中数组数据丢失

c# - devexpress网格自定义按钮的Javascript问题

google-chrome-extension - 如何将 Chrome 扩展 MV3 与 PayPal 集成

javascript - 填写表单时不会启用提交按钮

javascript - 使用 Chrome 扩展程序访问 Google Chrome 浏览器中的搜索查询文本

javascript - 如何知道当前环境是 chrome 扩展中的 content.js 还是 background.js

javascript - Chrome 扩展消息作为对象传递

google-chrome - 为什么我打包的 chrome 扩展没有更新?

javascript - 检查 Dynamics CRM 事件在客户端是打开还是关闭

javascript - 滚动时将每个 div 视为 "page"