Desencadenar y Capturar una Excepción
En este paso, aprenderá a manejar errores en tiempo de ejecución, conocidos como excepciones. Una excepción no manejada terminará inmediatamente su función. Primero creará una función que falla y luego la modificará para capturar la excepción de manera elegante.
Creemos una función simple_divide que realiza una división entera. Esta función tiene un defecto potencial: fallará si intenta dividir por cero.
CREATE OR REPLACE FUNCTION simple_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
END;
$$ LANGUAGE plpgsql;
Primero, llame a la función con entradas válidas para confirmar que funciona correctamente:
SELECT simple_divide(10, 2);
La salida será el resultado de la división:
simple_divide
---------------
5
(1 row)
Ahora, llame a la función con un denominador cero para activar una excepción:
SELECT simple_divide(10, 0);
Este comando fallará y devolverá un mensaje de error. La ejecución de la función se aborta.
ERROR: division by zero
CONTEXT: PL/pgSQL function simple_divide(integer,integer) line 3 at RETURN
Esta es una excepción no manejada. Para evitar que la función falle, puede usar un bloque EXCEPTION. Creemos una nueva función safe_divide que incluya el manejo de errores.
CREATE OR REPLACE FUNCTION safe_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'Error: Cannot divide by zero.';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Así es como funciona el bloque EXCEPTION:
BEGIN...END;: Esto define un bloque de código.
EXCEPTION: Esta palabra clave inicia la sección de manejo de excepciones.
WHEN division_by_zero THEN: Esto especifica que el código siguiente solo se ejecutará cuando ocurra un error de division_by_zero.
- El código dentro del manejador genera un aviso y devuelve
NULL en lugar de fallar.
Ahora, llame a la nueva función safe_divide con un denominador cero:
SELECT safe_divide(10, 0);
Esta vez, la función no falla. Captura la excepción, muestra su aviso personalizado y devuelve NULL.
NOTICE: Error: Cannot divide by zero.
safe_divide
-------------
(1 row)
Ha capturado con éxito una excepción específica y controlado la salida de la función.