使用 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
我在我的应用程序中使用 chrome.fileSystem
API 打开文件。当我单击文件选择器对话框的 Cancel
按钮时,发生错误:
Unchecked
runtime.lastError
while runningfileSystem.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);
此错误与每个
只是为了分享我的案例;
删除该行后错误消失;
res.end()
来自 nodejs 应用程序上的 http headers