DMarlon Studio

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.

JavaScript · Errores: try, catch y throw en DMarlon Studio: el código del ejemplo y su salida en la terminal

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.name y error.message dicen qué ha pasado.
  • finally se 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.