JavaScript de Cero a Experto / Asincronía II
Errores asíncronos: try, catch y throw
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:
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.