Javascript 使用Chrome API时未选中runtime.lastError

Javascript 使用Chrome API时未选中runtime.lastError,javascript,google-chrome-extension,google-chrome-app,Javascript,Google Chrome Extension,Google Chrome App,我在我的应用程序中使用chrome.fileSystemAPI打开一个文件。单击文件选择器对话框的取消按钮时,出现错误: 运行文件系统时未选中runtime.lastError。选择entry:用户已取消 如何修复此错误?此错误在本例中并不重要,但我将解释它以及如何消除它 这个错误是什么? ChromeAPI大多是异步的:您有一个回调,在操作完成时调用 如果使用chrome.fileSystem.chooseSentry,所选条目将被传递到回调: chrome.fileSystem.choose

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

运行文件系统时未选中
runtime.lastError
。选择entry:用户已取消


如何修复此错误?

此错误在本例中并不重要,但我将解释它以及如何消除它

这个错误是什么? ChromeAPI大多是异步的:您有一个回调,在操作完成时调用

如果使用chrome.fileSystem.chooseSentry,所选条目将被传递到回调:

chrome.fileSystem.chooseEntry(
  {/* options */},
  function(entry) {
    // This is the callback for the API call; you can do something with entry
  }
);
但是,API不能保证产生结果。例如,在您的情况下,用户可能会通过单击“取消”拒绝提供访问权限。那么就没有条目可供使用,您可能需要解释为什么会发生这种情况。如何在不使用额外的“error”参数污染所有回调的情况下引发错误

通常,Chrome会在调用回调时设置一个全局变量,
Chrome.runtime.lastError
在Chrome异步API中使用此参数而不是错误参数是一致的。事实上,引用
Chrome.fileSystem
文档:

通过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调用正常完成时

我能赶上吗? 不是真的;它不是由您的代码引发的,而是在ChromeAPI中处理异步任务的清理代码;因此,使用
尝试。。。回调中的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看到您在出现错误时检查了该值(即,在回调中对其进行了评估),就不会抛出该错误。

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

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

chrome.windows.remove(
        foo,
        function ignore_error() { void chrome.runtime.lastError; }
);
计算其操作数,然后返回
未定义的
。我认为这段代码相当有效地记录了它的目的是忽略错误:)

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

更新在ES6中,您可以使用较短的语法:


在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);

也许你应该试试。。。CATCH block.@Seti在这种情况下没有帮助。那么,也许你可以给我们你在chrome.filesystem中使用的代码?@Seti看到我的答案,为什么
试试。。。catch
抓不到它。@Xan谢谢!您的回复非常有用~我想是的,但是如果他添加了他正在使用的代码,并且我们发现他的回调无法清除错误-我们可以更快地回答。谢谢您的回复,这非常有用@没问题。还澄清了这不是检查错误的唯一方法,而是跨ChromeAPI的统一方法。难以置信的答案!谢谢你花时间写这篇文章。我从来没有说过我认为这是一个好的架构,但它是什么——这是Chrome API早期的一个设计决定。我不是Chrome开发团队的成员,因此我无法告诉您选择此选项的原因。未捕获的TypeError:无法读取的属性“remove”undefined@Jordan
chrome.windows
是扩展API的一部分。如果您试图在常规网页上使用此选项,
chrome.windows
不存在,这会导致您看到的错误。
function catchLastError(){
  if(chrome.runtime.lastError){
    console.log("error: ", chrome.runtime.lastError);
  }else{
    // some code goes here.
  }
}

chrome.fileSystem.chooseEntry(yourEntry,catchLastError);