Lección 18 · 18 de 20
Errores: try, catch y throw · JavaScript
Controle los errores en JavaScript: capture fallos con try/catch, use finally y lance sus propios errores con throw, Error y RangeError.

Algunos fallos detienen el programa, como leer una propiedad de null. Si el código que puede fallar va dentro de `try`, el error no lo detiene: salta al bloque `catch`, que recibe un objeto con el tipo (error.name, aquí TypeError) y la explicación (error.message).
JSON.parse lanza un error cuando el texto no es JSON válido, como {stock: 5}, cuya clave no lleva comillas. safeParse lo captura y devuelve null en lugar de romperse. El bloque `finally` se ejecuta siempre, haya error o no, y sirve para tareas que no pueden quedarse sin hacer, como cerrar un archivo.
Con `throw` el programa lanza sus propios errores cuando los datos no tienen sentido. withdraw lanza un Error si la cantidad no es positiva y un `RangeError` si supera el saldo; new Error("mensaje") crea el error con su explicación.
El bucle prueba tres retiradas, cada una con su propio try/catch: la primera sale bien y las otras dos muestran su mensaje sin detener las demás. Así se separa el código que detecta el problema (throw) del que decide qué hacer con él (catch).
Código · main.js
// Some mistakes stop the program: try/catch captures them.const user = null;try { console.log(user.name); // reading a property of null fails} catch (error) { console.log("Caught:", error.name, "-", error.message);}function safeParse(text) { try { return JSON.parse(text); // throws if the text is not valid JSON } catch (error) { console.log(`Not valid JSON: ${text}`); return null; } finally { console.log(" (finally always runs)"); }}console.log(safeParse('{"stock": 5}'));console.log(safeParse("{stock: 5}"));// throw raises your own error when the data is wrong.function withdraw(balance, amount) { if (amount <= 0) throw new Error("the amount must be positive"); if (amount > balance) throw new RangeError(`only ${balance} euros left`); return balance - amount;}for (const amount of [30, -10, 500]) { try { console.log(`Withdraw ${amount}: balance ${withdraw(100, amount)}`); } catch (error) { console.log(`Withdraw ${amount} failed: ${error.message} (${error.name})`); }}Salida · node main.js
Caught: TypeError - Cannot read properties of null (reading 'name')
(finally always runs)
{ stock: 5 }
Not valid JSON: {stock: 5}
(finally always runs)
null
Withdraw 30: balance 70
Withdraw -10 failed: the amount must be positive (Error)
Withdraw 500 failed: only 100 euros left (RangeError)Para recordar
try { ... } catch (error) { ... }captura los errores.error.nameyerror.messagedicen qué ha pasado.finallyse ejecuta siempre.throw new Error("...")lanza un error propio.
Ejercicio
Escriba parseAge(text) que lance un error si el texto no es un número o si la edad es negativa o mayor de 120, y pruébela con "35", "abc" y "-4" dentro de un try/catch.