Lección 43: Try / Catch / Finally
🧠 Concepto
Section titled “🧠 Concepto”El bloque try...catch...finally permite manejar errores en tiempo de ejecución sin que el programa se detenga abruptamente.
Sintaxis básica
Section titled “Sintaxis básica”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');}El objeto error
Section titled “El objeto error”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
Section titled “💻 Ejemplo”// Ejemplo práctico: parsear JSON de forma segurafunction 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 recursosfunction 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 } }}⚠️ Nota
Section titled “⚠️ Nota”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 validartry { JSON.parse(datos);} catch { // usar datos por defecto}
// ✅ Bien: validar antesif (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.
📝 Ejercicio
Section titled “📝 Ejercicio”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)); // 5console.log(dividirSeguro(10, 0)); // "Error: división por cero"// En ambos casos debe imprimir "Operación completada"