a diferencia de lo que cabría esperar, el siguiente código no activará el controlador window.error
window.addEventListener("error",function(error){ alert("uncaught error somewhere!"); }); (async function(){ let foo= ((await ( await fetch("/no_json_plz_i_want_an_error")).json())); })();
(la razón es "porque el error ocurre en un contexto de promesa" de acuerdo con un comentario sobre esta pregunta: ¿por qué no se activan los errores fetch().json() window.onerror? )
¿Cuál es la forma correcta de propagarlo explícitamente al controlador de errores de la ventana? esto tampoco funciona, por alguna razón todavía no se propaga a window.error:
(async function(){ let foo= ((await ( await fetch("/no_json_plz_i_want_an_error")).json())); })().catch(function(err){ throw err; });
esto tampoco parece funcionar (¿por qué? ni idea)
(async function(){ let foo= ((await ( await fetch("/no_json_plz_i_want_an_error")).json())); })().catch(function(err){ let ev = new ErrorEvent(err.message, err); window.dispatchEvent(ev); });
y este enfoque falla con el error Uncaught (in promise) DOMException: Failed to execute 'dispatchEvent' on 'EventTarget': The event provided is uninitialized.
, Lo que sea que eso signifique
(async function(){ let foo= ((await ( await fetch("/no_json_plz_i_want_an_error")).json())); })().catch(function(err){ let ev= document.createEvent("ErrorEvent"); ev.error=err; window.dispatchEvent(ev); });
entonces... ¿cuál es la forma correcta de hacerlo?
En su lugar, puede usar el evento de unhandledrejection
para detectar el error de promesas en el objeto de la ventana.
Editar:
Como fetch() aún devolverá el objeto de respuesta y no se arrojará ningún error. Puede arrojar un error cuando la response.ok
es falsa. Vea la función run1
continuación:
La función run2
arrojará un error de token JSON ya que response.ok
es falso e intenta analizar los datos.
Puede intentar ejecutar en su entorno local porque fiddle puede envolver el manejo de errores en la consola.
window.addEventListener("unhandledrejection", function (e) { console.log("Error occurred: " + e.reason.message); }); (async function run1() { try { let response = await fetch("/no_json_plz_i_want_an_error"); if (response.ok) { const data = response.json(); } else { throw new Error("Unable to fetch()"); } } catch (err) { throw new Error(err); } })(); (async function run2() { try { await (await fetch("/no_json_plz_i_want_an_error")).json(); } catch (err) { throw new Error(err); } })();