javascript - how - Unchecked runtime.lastError cuando se utiliza la API de Chrome
how to do a chrome extension (3)
Este error no es importante en este caso, pero lo explicaré y cómo deshacerme de él.
¿Cuál es este error?
Las API de Chrome son en su mayoría asíncronas: tiene una devolución de llamada que se llama cuando finaliza la operación.
En el caso de chrome.fileSystem.chooseEntry
, la entrada elegida (o entradas) se pasará a una devolución de llamada:
chrome.fileSystem.chooseEntry(
{/* options */},
function(entry) {
// This is the callback for the API call; you can do something with entry
}
);
Sin embargo, no se garantiza que la API arroje un resultado. Por ejemplo, como en su caso, el usuario puede negarse a proporcionar acceso haciendo clic en "Cancelar". Entonces no hay ninguna entrada para trabajar, y es posible que desee una explicación de por qué sucedió eso. ¿Cómo generar un error sin contaminar todas las devoluciones de llamada con un argumento extra de "error"?
Por lo general, Chrome trata esto al establecer una variable global, chrome.runtime.lastError
, en el momento en que se llama a la devolución de llamada. Es uniforme a través de las API asíncronas de Chrome para usar esto en lugar de un argumento de error. De hecho, citando los documentos de chrome.fileSystem
:
Todas las fallas se notifican a través de chrome.runtime.lastError.
- Si todo está bien, será
undefined
. - Si hay un problema, no estará vacío, y
chrome.runtime.lastError.message
explicará lo que está mal.
Sin embargo, algunas devoluciones de llamada no verificaron esta variable de error. Esto puede indicar un error de programación, y Chrome agregó cheques que chrome.runtime.lastError
está realmente verificado (evaluado) en una devolución de llamada. De lo contrario, considera que se trata de una excepción no controlada y arroja este error.
¿Por qué digo que no es importante?
Si bien es un error, no interrumpirá la ejecución de su programa (se lanza al final de una tarea asíncrona) y realmente no se mostrará a sus usuarios.
Y aunque digo que no es importante, debes verificar la lógica de tu programa. Puede o no estar bien; esta es una advertencia (severa).
¿Por qué existe?
Para advertirte, tú , el desarrollador, que tu código probablemente intente usar un resultado que no existe, porque algo salió mal.
Es posible que ya esté buscando un error, por ejemplo
if (entry) {
// Process entry
} else {
// Something went wrong (but what?)
}
Chrome no utiliza heurísticas complejas para ver si su código espera esta posibilidad. Como se indicó, los errores se informan a través de chrome.runtime.lastError
, y se espera que usted lo verifique.
Tenga en cuenta que este error solo se produce cuando algo malo ocurre, y no cuando la llamada API finaliza normalmente.
¿Puedo atraparlo?
Realmente no; no lo plantea su código, sino el código de limpieza que maneja tareas asíncronas en la API de Chrome; por lo tanto, usar try ... catch
en su devolución de llamada no ayudará. Como no es asincrónico, tampoco sirve de nada try
la llamada a la API original.
¿Qué hacer con ello?
Debería agregar lógica a su devolución de llamada que verifica problemas de la forma en que Chrome lo espera, y probablemente reaccione a ellos.
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
}
}
Siempre que Chrome vea que ha verificado el valor cuando hay un error (es decir, evaluado dentro de su devolución de llamada), no se lanzará el error.
Uso la API chrome.fileSystem
en mi aplicación para abrir un archivo. Cuando hago clic en el botón Cancel
del cuadro de diálogo del selector de archivos, aparece un error:
runtime.lastError
al ejecutarfileSystem.chooseEntry
: Usuario cancelado
¿Cómo arreglar este error?
Tarde en la fiesta, pero así es cómo chrome.windows.remove()
el error en una chrome.windows.remove()
a chrome.windows.remove()
, en caso de que ayude a alguien más. En lugar de
chrome.windows.remove(foo); // unconditional; runtime.lastError not checked
solía
chrome.windows.remove(
foo,
function ignore_error() { void chrome.runtime.lastError; }
);
void
evalúa su operando y luego devuelve undefined
. Creo que este código documenta bastante efectivamente que su propósito es ignorar los errores :).
En aras de la brevedad, ignore_error()
podría retirarse de esta llamada y usarse para múltiples llamadas API de chrome
, o podría omitirse el nombre ignore_error
.
Para este tipo de errores, try catch
no será útil. En su lugar, puede acceder a la variable global chrome.runtime.lastError
como @xan se menciona en su increíble respuesta anterior (por cierto, ¡debería leerla y chrome.runtime.lastError
al alza!).
Ahora, aquí proporciono un ejemplo que se puede usar:
function catchLastError(){
if(chrome.runtime.lastError){
console.log("error: ", chrome.runtime.lastError);
}else{
// some code goes here.
}
}
chrome.fileSystem.chooseEntry(yourEntry,catchLastError);