Saltar al contenido
Curso de JavaScript
Todos los cursos Ir al ejercicio →

Errores, depuración y almacenamiento

  • ⏱ 45 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Capturar y lanzar errores con try/catch/finally y throw.
  • Depurar con un método y con las herramientas del navegador.
  • Guardar y leer datos con localStorage y JSON de forma segura.
  • Organizar el código con módulos y aplicar hábitos de código limpio.

1.Los errores: tipos y causas

Todo programa tiene errores, y aprender a leerlos, controlarlos y encontrarlos es lo que separa a quien empieza de quien programa con soltura. JavaScript distingue varios tipos:

ErrorCuándo ocurreEjemplo
SyntaxErrorEl código está mal escrito y ni siquiera arrancaUna llave o comilla sin cerrar
ReferenceErrorUsas un nombre que no existeconsole.log(variableInexistente)
TypeErrorHaces algo con un valor del tipo equivocadonull.nombre, 5()
RangeErrorUn valor fuera de rangonew Array(-1), recursión infinita
Error (propio)Los que tú lanzas con throwthrow new Error("Falta el nombre")
▶ Provoca los errores más comunes
Consola

2.try, catch, finally y throw

Controlar un error
try {
  // código que PUEDE fallar
  const datos = JSON.parse(texto);
  mostrar(datos);
} catch (error) {
  // qué hacer si falla
  console.error("No se pudo leer:", error.message);
} finally {
  // se ejecuta SIEMPRE, haya o no error (limpieza)
  ocultarCargando();
}
PartePara qué
try { … }Código que puede fallar
catch (error) { … }Se ejecuta solo si hubo error; error.message explica qué pasó
finally { … }Se ejecuta siempre: ideal para quitar un «cargando…»
throw new Error("…")Lanzas tú un error cuando algo no es válido
▶ Lanzar y atrapar errores propios
Consola

💡 Consejo · Falla pronto y con claridad

Valida los datos al principio de una función y lanza un error con un mensaje útil: «Falta el precio» es mucho mejor que dejar que el programa falle tres funciones después con un críptico NaN. Y captura los errores solo donde puedas hacer algo útil con ellos.

3.Depurar: encontrar el error

Depurar (*debugging*) es el arte de encontrar por qué algo no hace lo que esperas. El método siempre es el mismo:

  1. Reproduce el problema de forma fiable.
  2. Lee el mensaje de error y la línea que indica.
  3. Formula una hipótesis: ¿qué valor creo que tiene cada variable aquí?
  4. Compruébala con console.log o con el depurador.
  5. Corrige una cosa y vuelve a probar.

Más allá de console.log

▶ Un repertorio de console
Consola

El depurador del navegador

Con F12 → pestaña Fuentes (*Sources*) puedes detener el programa en una línea y mirarlo desde dentro:

HerramientaQué hace
Punto de interrupción (*breakpoint*)Clic en el número de una línea: el programa se pausa ahí
debugger;Una instrucción que pausa el programa si las herramientas están abiertas
Paso a paso (*step over / into*)Avanza una línea (o entra en la función que se llama)
Variables locales y *Watch*Ver (y vigilar) el valor de cada variable en ese momento
Pila de llamadas (*call stack*)Qué funciones llevaron hasta aquí
Pestaña Red (*Network*)Ver cada petición, su respuesta y su tiempo

📌 Nota · Leer una pila de errores

Cuando un error aparece en la consola, la pila (*stack trace*) lista las funciones por las que pasó, de la más reciente (arriba) a la más antigua. Busca la primera línea que sea de tu código: casi siempre ahí está el problema.

4.Guardar datos en el navegador: localStorage

Las variables desaparecen al recargar la página. Para conservar datos (una lista de tareas, una preferencia, un carrito) el navegador ofrece localStorage: un pequeño almacén de pares clave–valor que persiste aunque cierres el navegador.

MétodoQué hace
localStorage.setItem(clave, valor)Guarda un valor (siempre como texto)
localStorage.getItem(clave)Lo lee; devuelve null si no existe
localStorage.removeItem(clave)Borra una clave
localStorage.clear()Borra todo lo guardado por tu sitio
▶ Guardar y leer
Consola

📌 Nota · En este editor es temporal

Por seguridad, los editores del curso funcionan en un entorno aislado y simulan localStorage en memoria: los datos no sobreviven a recargar. En tu propia página, sí quedarán guardados de verdad. Compruébalo en F12 → Aplicación (*Application*) → Almacenamiento local.

AspectolocalStoragesessionStorageCookies
DuraHasta que se borreHasta cerrar la pestañaSegún su caducidad
Tamaño~5 MB~5 MB~4 KB
Se envía al servidorNoNoSí, en cada petición
TípicoPreferencias, borradores, listasDatos de una sesiónInicio de sesión (lo gestiona el servidor)

5.Guardar con seguridad

  1. Convierte con JSON al guardar y al leer.
  2. Lee siempre con un valor por defecto: ?? [], porque la primera vez no hay nada.
  3. Envuelve JSON.parse en try/catch: alguien puede haber alterado el dato.
  4. Usa un nombre de clave con prefijo (miapp:tareas) para no chocar con otros datos.
Un par de funciones robustas
const CLAVE = "miapp:tareas";

function leerTareas() {
  try {
    return JSON.parse(localStorage.getItem(CLAVE)) ?? [];
  } catch {
    return [];                        // dato corrupto: empezamos de cero
  }
}

function guardarTareas(tareas) {
  localStorage.setItem(CLAVE, JSON.stringify(tareas));
}

⚠️ Importante · Nunca guardes secretos

localStorage no es seguro: cualquier script de la página (y cualquiera que use ese navegador) puede leerlo. No guardes contraseñas, tokens de acceso ni datos personales sensibles. Úsalo para preferencias y datos sin riesgo.

6.Organizar el código: módulos

Cuando un programa crece, un solo archivo de 800 líneas se vuelve inmanejable. Los módulos de ES dejan dividir el código en archivos con una responsabilidad cada uno, que exportan lo que ofrecen e importan lo que necesitan:

tareas.js (exporta)
const CLAVE = "miapp:tareas";

export function leerTareas() { /* … */ }
export function guardarTareas(tareas) { /* … */ }
export const MAXIMO = 100;

export default function crearTarea(texto) {
  return { id: Date.now(), texto, hecha: false };
}
app.js (importa)
import crearTarea, { leerTareas, guardarTareas, MAXIMO } from "./tareas.js";

const tareas = leerTareas();
tareas.push(crearTarea("Estudiar módulos"));
guardarTareas(tareas);
En el HTML
<script type="module" src="js/app.js"></script>

💡 Consejo · Cómo dividir

Una guía sencilla: un archivo para los datos y su almacenamiento, otro para la lógica (funciones puras) y otro para la interfaz (DOM y eventos). Si dudas, pregúntate: «¿puedo probar esta función sin una página?»

7.Hábitos de código limpio

📌 Nota · Seguridad básica

Nunca confíes en los datos que llegan de fuera (formularios, URL, APIs): valídalos y, al mostrarlos, usa textContent. Cualquier verificación importante (precios, permisos) debe repetirse en el servidor, porque el código del navegador se puede modificar.

8.Errores frecuentes

📒 Apuntes para llevar

  • Los errores se clasifican (SyntaxError, ReferenceError, TypeError…); la consola indica el tipo, el mensaje y la línea.
  • try { … } catch (error) { … } finally { … } controla los fallos; throw new Error("…") lanza los propios.
  • Valida al principio y falla con mensajes claros; captura solo donde puedas hacer algo útil.
  • Depura con método: reproduce, lee, formula una hipótesis, comprueba y corrige una cosa a la vez.
  • console.table, group, assert, los puntos de interrupción y debugger van mucho más allá de console.log.
  • localStorage guarda texto de forma persistente: usa JSON.stringify/parse y un valor por defecto al leer.
  • No guardes secretos en el navegador; sessionStorage dura una pestaña y las cookies se envían al servidor.
  • Los módulos (import/export, type="module") dividen el código; Prettier, ESLint y los nombres claros lo mantienen sano.

9.Glosario

TérminoSignificado
ExcepciónError que se «lanza» y detiene el programa si nadie lo atrapa.
try / catchEstructura que controla errores.
throwLanza un error a propósito.
DepurarEncontrar y corregir la causa de un error.
Punto de interrupciónMarca donde el depurador pausa el programa.
localStorageAlmacén persistente de pares clave–valor en el navegador.
MóduloArchivo que exporta e importa partes de código.
LinterHerramienta que revisa el código y avisa de problemas.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Cuándo se ejecuta el bloque finally?

localStorage.setItem("lista", [1, 2, 3]) guarda…

¿Qué devuelve localStorage.getItem("clave") si la clave no existe?

¿Cuál de estas cosas no deberías guardar en localStorage?

En un error, ¿dónde suele estar el problema dentro de la pila (stack trace)?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio