make how google extension example developer create chrome apps javascript google-chrome-extension google-chrome-app

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, , 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 ejecutar fileSystem.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);