在这种情况下,这个错误并不重要,但我将解释它以及如何消除它。
这是什么错误?
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
docs:
所有失败都会通过 chrome.runtime.lastError 通知。
- 如果一切顺利,那就会了
undefined
.
- 如果有问题,它将非空,并且
chrome.runtime.lastError.message
会解释出了什么问题。
但是,某些回调没有检查此错误变量。这可能表明存在编程错误,Chrome 添加了检查chrome.runtime.lastError
实际上是在回调中检查(评估)的。如果不是,它认为这是一个未处理的异常,并抛出此错误。
为什么我说不重要呢?
虽然这是一个错误,但它不会中断程序的执行(它在异步任务结束时抛出),并且不会真正显示给用户。
虽然我说这并不重要,但您应该检查程序的逻辑。它可能会也可能不会——这是一个(严厉的)警告。
它为何存在?
警告,you,开发人员,您的代码probably尝试使用不存在的结果,因为出了问题。
您可能已经在检查错误,例如
if (entry) {
// Process entry
} else {
// Something went wrong (but what?)
}
Chrome 不会采用复杂的启发式方法来查看您的代码是否需要这种可能性。如前所述,错误是通过以下方式报告的chrome.runtime.lastError
,并且您应该检查它。
请注意,仅当出现问题时才会引发此错误does发生,而不是在 API 调用正常完成时发生。
我能抓住它吗?
并不真地;它不是由您的代码引发的,而是由 Chrome API 中处理异步任务的清理代码引发的;因此使用try ... catch
在你的回调中不会有帮助。由于它是异步的,因此使用try
围绕原始 API 调用也无济于事。
该怎么办?
您应该向回调添加逻辑,以 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出现错误时的值(即在回调中对其进行评估),不会引发错误。