try-catch: conceptos básicos para el manejo de errores
Al finalizar este tema
Comprenderá el principio de funcionamiento de try-catch y podrá determinar dónde debe capturar los errores.
Si se produce un error, el programa se detiene.
const data = JSON.parse("not json");
console.log("Esta línea no se ejecuta");Si JSON.parse genera un error, el código posterior no se ejecutará. En el navegador, la ejecución del script se detiene.
Captura de errores con try-catch
try {
const data = JSON.parse("not json");
} catch (error) {
console.log("Fallo al analizar:", error.message);
}
console.log("Esta línea se ejecuta");try Si se produce un error dentro del bloque, la ejecución salta inmediatamente al bloque catch. El programa continúa. El código posterior al bloque catch también se ejecuta normalmente.
error El objeto tiene las propiedades .message (mensaje de error) y .stack (pila de llamadas).
Lanzar errores directamente con throw
Además de los errores que JavaScript lanza automáticamente, también se pueden lanzar errores manualmente:
function divide(a, b) {
if (b === 0) {
throw new Error("No se puede dividir por cero");
}
return a / b;
}
try {
divide(10, 0);
} catch (error) {
console.log(error.message); // "No se puede dividir por cero"
}throw interrumpe inmediatamente la ejecución de la función y propaga el error a la cláusula catch más cercana. Se omiten todas las funciones intermedias.
finally — Ejecución incondicional
try {
const file = openFile("data.txt");
processFile(file);
} catch (error) {
console.log("Fallo al procesar");
} finally {
closeFile(file);
}finally se ejecuta en todo caso, independientemente de si se produce un error o no. Se utiliza para tareas de "limpieza", como cerrar archivos, desconectar conexiones de red y restablecer el estado de carga.
setLoading(true);
try {
const data = await fetchData();
setData(data);
} catch (error) {
setError(error.message);
} finally {
setLoading(false);
}async/await y try-catch
En las funciones asíncronas, el bloque try-catch funciona de la misma manera:
async function loadUser(id) {
try {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (error) {
console.log("Fallo al cargar usuario:", error.message);
return null;
}
}await antes de try permite capturar tanto errores de red como errores HTTP.
¿Dónde gestionarlos?
Si se utiliza try-catch en todas partes, el código se vuelve ilegible. Existe un principio:
Gestiona los errores donde puedas solucionarlos. Captura los errores en los lugares donde puedas mostrar un mensaje de error o reintentar la llamada a la API. Si solo vas a registrar un log, no es necesario capturarlos.
// Mal ejemplo: atrapar sin hacer nada
try {
doSomething();
} catch (e) {
// Ignorar
}
// Buen ejemplo: dar retroalimentación al usuario
try {
await saveData(formData);
showSuccess("Guardado");
} catch (error) {
showError("Error al guardar: " + error.message);
}Puntos clave
try-catchevita que los errores detengan el programa. Genera un error intencionalmente conthrow, y el bloquecatchmás cercano lo capturará (catch). Captura los errores solo en los lugares donde puedas recuperarlos.