Skip to content

Lección 43: Try / Catch / Finally

El bloque try...catch...finally permite manejar errores en tiempo de ejecución sin que el programa se detenga abruptamente.

try {
// Código que puede lanzar un error
const resultado = JSON.parse('{"invalido"}');
console.log(resultado);
} catch (error) {
// Se ejecuta solo si hay error en try
console.error('Error:', error.message);
} finally {
// Se ejecuta SIEMPRE (haya error o no)
console.log('Bloque finally ejecutado');
}
try {
valorNoDefinido;
} catch (error) {
console.log(error.name); // "ReferenceError"
console.log(error.message); // "valorNoDefinido is not defined"
console.log(error.stack); // Traza completa del error (útil para debugging)
}
// Ejemplo práctico: parsear JSON de forma segura
function parsearJSON(jsonString) {
try {
const datos = JSON.parse(jsonString);
return { exito: true, datos };
} catch (error) {
return { exito: false, error: error.message };
}
}
const resultado1 = parsearJSON('{"nombre": "Ana", "edad": 28}');
console.log(resultado1); // { exito: true, datos: { nombre: 'Ana', edad: 28 } }
const resultado2 = parsearJSON('{JSON mal formado}');
console.log(resultado2); // { exito: false, error: 'Unexpected token...' }
// finally para limpiar recursos
function procesarArchivo(archivo) {
let recurso = null;
try {
recurso = abrirArchivo(archivo);
// procesar...
return true;
} catch (error) {
console.error(`Error con archivo ${archivo}:`, error.message);
return false;
} finally {
if (recurso) {
cerrarArchivo(recurso); // Siempre se cierra
}
}
}

No uses try/catch para control de flujo normal. Es lento comparado con condicionales y puede ocultar bugs. Úsalo para errores impredecibles, no para validaciones predecibles.

// ❌ Mal: usar try/catch para validar
try {
JSON.parse(datos);
} catch {
// usar datos por defecto
}
// ✅ Bien: validar antes
if (typeof datos === 'string') {
try {
JSON.parse(datos);
} catch {
// error de parseo real (impredecible)
}
}

El catch puede omitir el parámetro de error si no te interesa:

try {
algo();
} catch {
console.log('Error, pero no me importa cuál');
}

En código asíncrono, usa try/catch con async/await:

async function obtenerUsuario(id) {
try {
const respuesta = await fetch(`/api/usuarios/${id}`);
const data = await respuesta.json();
return data;
} catch (error) {
console.error('Error al obtener usuario:', error);
return null;
}
}

Siempre incluye finally cuando necesites liberar recursos (cerrar conexiones, limpiar timers, ocultar loaders). finally se ejecuta incluso si hay un return en try o catch.

Escribe una función dividirSeguro que tome dos números y devuelva el resultado de la división. Si el divisor es 0, debe capturar el error y devolver “Error: división por cero”. Asegúrate que siempre se imprima “Operación completada” en la consola.

function dividirSeguro(a, b) {
// Tu código aquí
}
console.log(dividirSeguro(10, 2)); // 5
console.log(dividirSeguro(10, 0)); // "Error: división por cero"
// En ambos casos debe imprimir "Operación completada"