6 febrero, 2025

CONTROLAR ERRORES EN TYPESCRIPT CON TRY-CATCH-FINALLY

Hola a todos,

Recuerdo que a finales de 2019 me inicié de forma muy intensa a trabajar con Typescript, de hecho a día de hoy tengo la firme convicción de que será uno de los sustitutos de VBA (es cuestión de tiempo).

Actualmente, con las posibilidades que trae de uso con Power Automate, la verdad es que no cabe duda de su potencial. Y por eso, no dejaré de recomendar que os acerquéis y adquiráis familiaridad con este lenguaje.

Y algo que tendremos que controlar cuando ejecutemos nuestros scripts (en la plataforma que sea) es que podamos controlar errores. Porque los errores los puede provocar el código mal escrito, una lógica funcional deficiente o la calidad de los datos.

Por ello, cuando trabajamos con typescript tendremos que usar declaraciones como Try, Catch y Finally. Y en mis palabras que aquí repito de otro post anterior:

Básicamente lo que hace la declaración en una primera parte es tratar (Try) de realizar una tarea, y en caso de producirse una excepción (error) se lanza una respuesta con la sentencia Catch.

Finally recoge la parte final del proceso, y son las sentencias que van después de Try y Catch.

Dicho esto, os dejaré un script que al ejecutarlo veréis como se utilizan todas estas declaraciones:

function main(libro: ExcelScript.Workbook) {
    let hoja = libro.getActiveWorksheet();
    // Ejecutamos función para limpiar datos anteriores
    limpiarCeldas(hoja);
    // Creamos la tabla de ejemplo si no existe
    let tabla = hoja.getTables()[0] || crearTablaEjemplo(hoja);
    // Inicializamos variables para capturar posibles errores y la suma total
    let errorGeneral = "";
    let suma = 0;
    let valoresValidos: number[] = [];
    try {
        // Intentamos acceder a una columna que no existe para forzar un error general
        let columnaInexistente = tabla.getColumnByName("Col1"); // Salta error
        let rangoValores = columnaInexistente.getRangeBetweenHeaderAndTotal();
    } catch (error) {
        // Si ocurre un error general, guardamos el mensaje en la variable errorGeneral
        errorGeneral = `Error general: ${error.message}`;
    }
    try {
        // Intentamos acceder a la columna "Valores" para procesar sus datos
        let rangoValores = tabla.getColumnByName("Valores").getRangeBetweenHeaderAndTotal();
        let valores = rangoValores.getValues();
        // Recorremos cada valor de la columna para validarlos y sumarlos
        valores.forEach((valor, indice) => {
            try {
                let valorNumero = Number(valor);
                if (isNaN(valorNumero)) {
                    hoja.getRange(`B${indice + 2}`).setValue(`Error en fila ${indice + 2}: "${valor}" no es un número.`);
                } else {
                    valoresValidos.push(valorNumero);
                }
            } catch (error) {
                hoja.getRange(`B${indice + 2}`).setValue(`Error en fila ${indice + 2}: ${error.message}`);
            }
        });
        // Calculamos la suma de los valores válidos
        suma = valoresValidos.reduce((acumulador, numero) => acumulador + numero, 0);
    } catch (error) {
        // Si ocurre algún error al procesar la columna "Valores", se guarda en la variable errorGeneral
        errorGeneral += ` Error al procesar la columna "Valores": ${error.message}`;
    } finally {
        // Mostrar la suma total, independientemente de si hubo un error o no
        hoja.getRange("D1").setValue(`Suma total de valores válidos: ${suma}`);
        // Mostrar el mensaje de error general, si existe
        if (errorGeneral) {
            hoja.getRange("D3").setValue(errorGeneral);
        }
        // Mostrar el mensaje de proceso finalizado
        hoja.getRange("D2").setValue("Proceso de suma finalizado.");
    }
}
// Función para limpiar las celdas antes de ejecutar el script
function limpiarCeldas(hoja: ExcelScript.Worksheet) {
    // Limpiamos los mensajes de error en la columna "Mensaje" (columna B)
    let rangoMensajes = hoja.getRange("B2:B100");
    rangoMensajes.clear();
    // Limpiamos las celdas de resultados y errores generales
    hoja.getRange("D1").clear();
    hoja.getRange("D2").clear();
    hoja.getRange("D3").clear();
}

// Función para crear una tabla de ejemplo con nombre específico
function crearTablaEjemplo(hoja: ExcelScript.Worksheet): ExcelScript.Table {
    // Definimos los encabezados de la tabla
    const encabezados = [["Valores", "Mensaje"]];
    // Definimos los datos de ejemplo con algunos errores intencionales
    const datos = [[1500], ["ABC"], [1800], [-500], ["xyz"], [3000]];
    // Insertamos los encabezados en la hoja
    hoja.getRange("A1:B1").setValues(encabezados);
    // Insertamos los datos en la hoja
    hoja.getRange("A2:A7").setValues(datos);
    // Creamos la tabla a partir del rango y le asignamos el nombre "MiTabla"
    let tabla = hoja.addTable("A1:B7", true);
    tabla.setName("MiTabla"); // Asignamos el nombre "MiTabla" a la tabla
    return tabla;
}

Lo que hace el código es generar una tabla, y si está utiliza los datos generados, para mostrar una serie de informaciones. Hay errores que he colocado a propósito para que falle y capture el error. Aparecen las tres declaraciones.

Además he incluido dos funciones, una para crear una tabla si no encuentra datos (con los valores y contenido) y otra para limpiar el resultado de ejecuciones anteriores.

He comentado casi todas las líneas y por ello creo que no es necesario más explicación. Los errores que se recogen son: datos no numéricos en una suma e intentar leer de una columna que no existe.

Este es el resultado:

Y esto es el resultado, hemos conseguido finalizar el script sin que se detuviese por culpa de un error, lo hemos capturado y mostrado y generado el resultado.

Y esto es todo, espero que sea de utilidad.

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies