CodeForge

JavaScript de Cero a Experto / Asincronía II

Errores asíncronos: try, catch y throw

Teoría20 min20 XP

Toda operación remota puede fallar: el servidor caído, la red lenta, el dato que no existe. En las cadenas lo resolvía .catch; en el mundo async/await el guardián es try/catch — y la buena noticia es que es la MISMA estructura con la que JavaScript maneja todos sus errores, así que la aprendes una vez y te sirve para siempre.

La red de seguridad

Sigue la ruta de junio: cargarGastos lanza, el await convierte ese rechazo en una caída dentro del try, la línea del total se salta, el catch la recibe y el finally cierra igual. Es tu cadena .then/.catch/.finally del módulo 9 con la ropa nueva — mismo mecanismo, misma garantía.

throw: fallar a propósito y con criterio

throw new Error("mensaje") interrumpe la función en esa línea y lanza el error hacia arriba, en busca del try/catch más cercano — aunque esté en la función que te llamó, o en la que llamó a esa. Lo usarás para convertir "datos malos" en fallos explícitos:

validar-lanzando.js
async function cargarGasto(id) {
const gasto = await buscarEnServidor(id);
// dato inválido → fallo EXPLÍCITO, no un undefined silencioso
if (gasto === undefined) throw new Error(`gasto ${id} no existe`);
return gasto;
}

La alternativa — retornar undefined y que el que llama "adivine" — es la receta del bug silencioso: el problema explota tres funciones más allá, lejos de su causa. Lanzar temprano y atrapar donde se pueda decidir el plan B es el estilo profesional (y en el módulo 15 lo llevarás más lejos, con errores personalizados y debugging de verdad).

¿Y si nadie atrapa?

Un rechazo sin catch — ni de cadena ni de try — burbujea hasta la consola como unhandled promise rejection: el error rojo con el que el navegador te regaña por dejar un trapecista sin red. En desarrollo es tu alarma de "olvidaste manejar este fallo"; en producción es un usuario viendo una app rota sin explicación. Regla de oficio: toda función async que TÚ inicias (la de "arranque", como consultar()) debe tener su manejo de errores; las intermedias pueden dejar que el error suba — que suba es bueno, que se pierda es el pecado.

En tu try tienes 3 awaits seguidos: titular, gastos y guardarReporte. El de gastos rechaza. ¿Qué pasa con guardarReporte?

Mini-reto

Completa tu traducción de la lección pasada: al consultar de "Mi Bolsillo" con async/await, agrégale el try/catch/finally que le faltaba y reproduce EXACTAMENTE la salida del reto del módulo 9 (julio completo, junio al plan B, cierre siempre). Luego experimenta: quita el try/catch por completo, consulta junio, y estudia el error de "unhandled rejection" en la consola — mírale la cara al pecado para reconocerlo cuando se te escape uno de verdad.

Qué sigue

Ya esperas UNA promesa con elegancia. Pero ¿y cuando son varias — tres consultas que no dependen entre sí? Esperarlas en fila es regalar segundos; lanzarlas en paralelo y coordinar la llegada es el trabajo de Promise.all y sus tres hermanos. Próxima lección: el arte de esperar varias cosas a la vez.