Saltar al contenido principal
Página

Tema 4.1 - Manejo de excepciones

Anteriormente se mencionó que un bloque PL/SQL tiene una sección llamada EXCEPTION, pero nunca vimos su utilidad, ahora es el momento de enseñar cómo funciona.

Una excepción surge cuando hay un error en tiempo de ejecución que interrumpe el flujo normal del programa haciendo que se finalice “abruptamente”.

Cuando surge la excepción el proceso “salta” a la sección de manejo de excepciones (EXCEPTION). Si no hay alguna excepción para tratar el error que se presentó se sale del bloque o sub-bloque donde ocurrió.

Las excepciones sirven para poder controlar todas las anomalías que aparecen cuando se ejecuta el programa como por ejemplo una división por cero, la sentencia SELECT no recupere ninguna fila, entre otras.

La sintaxis para el manejo de excepciones se muestra a continuación.

Donde:

  1. Los corchetes representan la parte del código que es opcional.
  2. nombre_excepion es el nombre de la excepción en donde se va a ingresar cuando ocurra un error de ese tipo en el programa.
  3. Se pueden colocar varias excepciones.

Tipos de excepciones

Existen dos tipos de excepciones: Las excepciones que están predefinidas por Oracle y las excepciones que son definidas por el usuario.

Excepciones predefinidas por Oracle

Es un conjunto de excepciones definidas por Oracle por lo que no hay que declararlas y son disparadas automáticamente por PL/SQL como respuesta a un error.

A continuación, se verán algunas excepciones definidas por Oracle con su respectiva descripción.

Ejemplo 1:

En este ejemplo reflejaremos el uso de la excepción que se lanza cuando se divide entre cero.

Escribamos el siguiente código en PL/SQL y lo ejecutamos.

Como se pudo observar en el código, cuando se hace la división entre cero se lanza la excepción y el proceso salta a la sección de manejo de excepciones, donde ingresa al tipo de excepción al que pertenece este error, en este caso a la de ZERO_DIVIDE y hace las tareas que se le implementaron. Una vez hecho todas las tareas, finaliza la ejecución del programa.

Ejemplo 2:

Ahora es el turno de ver cómo ocurre una excepción de tipo INVALID_CURSOR. Para esto vamos a utilizar la información de la tabla EMPLEADO que se muestra a continuación.

En un script colocamos el siguiente código y lo ejecutamos.

La excepción se lanza porque declaramos un cursor explícito con FOR para que nos imprima los nombres de las personas de la empresa, cuando sale de este ciclo se cierra el cursor de forma implícita haciendo que la segunda línea después de END LOOP cause un error debido a que se quiere cerrar el cursor que ya se encuentra cerrado.

Ejemplo 3:

En este ejemplo se observa cómo puede ocurrir una excepción de tipo NO_DATA_FOUND.

Usaremos la información de la tabla PAIS para ejemplificar esta excepción.

Luego se escribe el siguiente código y lo ejecutamos.

La excepción se lanza debido a que la sentencia SELECT trata de obtener la capital del país de Bolivia y como este no está en la tabla PAIS entonces no trae ningún dato, por ende, ocasiona un error en la ejecución del programa y salta la excepción de tipo NO_DATA_FOUND.

Ejemplo 4:

Ahora mostraremos en qué situación se lanza una excepción TOO_MANY_ROWS. Antes de esto, tenemos que crear una tabla llamada PACIENTE y se le insertarán unos registros.

A continuación, se coloca el código para crear la tabla e insertar los registros en ella.

Si ejecutamos el script anterior nos quedará la tabla PACIENTE de esta manera:

Después escribimos el siguiente código y lo corremos.

La excepción ocurre porque cuando se utiliza la sentencia SELECT INTO sólo debe recuperar una fila para poder asignar el valor que se busca de esa fila a la variable que declaramos (apellido), y en nuestro ejemplo solicitamos que nos recupere los datos del paciente con nombre Estefania, pero ese nombre aparece en dos filas causando el error y que se dispare la excepción.

Excepciones definidas por el usuario

Este tipo de excepciones se deben declarar en la sección DECLARE y ser lanzadas de manera explícita.

Cuando el usuario define sus excepciones, se procede de la siguiente forma:

  1. Se declaran por medio del tipo de datos EXCEPTION. Ej: nombre_excepcion EXCEPTION.
  2. Se deben “disparar” mediante la sentencia RAISE. Ej: RAISE nombre_excepcion

El tratamiento que se les hace a estas excepciones es en la sección de EXCEPTION al igual que las que son predefinidas por Oracle.

Para que nos quede más claro todo esto, hagamos el siguiente ejemplo.

Ejemplo:

Utilizaremos la información de la tabla EMPLEADO.

Ahora escribimos el siguiente código.

Y la salida que nos muestra en pantalla luego de ejecutar nuestro script es:

Como podemos ver, declaramos nuestra excepción muy_alta en la sección DECLARE, después se hace una consulta para obtener la suma de todos los salarios de los empleados y guardarla en la variable salario_total, más adelante verificamos si el salario total de estos empleados no excede la cifra de 8000000. Si se excede lanza nuestra excepción muy_alta que es tratada en la sección EXCEPTION, de lo contrario no hará nada el programa.

Manejo de OTHERS

Este tipo excepción está predefinida y sirve para capturar una excepción que no ha sido tratada en el manejador de excepciones.

La excepción OTHERS debe escribirse de último en el manejador de excepciones.

Ejemplo 1:

Usaremos la tabla PACIENTE para mostrar el uso de la excepción de tipo OTHERS.

Ahora escribimos el código en PL/SQL y lo ejecutamos.

El error ocurre cuando no se encuentra el nombre de Manuela en la tabla PACIENTE y hace que el control salte al manejador de excepciones para que sea capturado y tratado.

Cuando entra a la sección EXCEPTION busca el tipo de excepción al que pertenece el error, pero como no se encuentra, entonces OTHERS la captura y hace las tareas que se especificaron en ella.

Ejemplo 2:

Acá vamos a mostrar el motivo de por qué la excepción OTHERS se debe escribir de último en el manejador de excepciones.

Para esto seguiremos usando la tabla PACIENTE.

Ahora escribimos el siguiente código.

Si ejecutamos el script, Oracle nos arroja un informe de error en donde nos advierte que OTHERS debe ser escrito de último en la sección EXCEPTION.

RAISE_APPLICATION_ERROR

Es un procedimiento definido por Oracle que permite a los programadores crear sus propias excepciones y asociarles un número de error y un mensaje. RAISE_APPLICATION_ERROR se puede utilizar en los siguientes lugares:

  1. Sección ejecutable (BEGIN).
  2. Sección de manejo de excepciones (EXCEPTION).

A continuación, se muestra la sintaxis de este procedimiento:

Donde:

  1. numero_error: Es un entero negativo que está en el rango de -20000 y -20999.
  2. mensaje: Es una cadena de caracteres de hasta 2048 bytes de longitud.
  3. TRUE: Este parámetro es opcional y hace que el error se coloque en la pila de errores anteriores.
  4. FALSE: Es un parámetro opcional que permite que el error reemplace todos los errores anteriores. Este valor es el predeterminado.

Una aplicación puede llamar a RAISE_APPLICATION_ERROR solo desde un subprograma (o método) almacenado en ejecución. Cuando se llama, RAISE_APPLICATION_ERROR finaliza el subprograma y devuelve un número de error definido por el usuario y un mensaje.

Este procedimiento es muy útil cuando se quiere cumplir con las reglas de negocio, como, por ejemplo: verificar que la cédula de un empleado no sea negativa o verificar que no se pueda ingresar más de cierta cantidad de empleados a un departamento de una empresa.

Ejemplo:

Vamos a utilizar los registros que tenemos en nuestra tabla EMPLEADO.

Supongamos que la empresa que tiene estos empleados, tiene una regla de negocio la cual dice que sólo puede tener un máximo de 6 de empleados debido a que es una empresa recién establecida y no tiene tanto presupuesto. Si hay más empleados de lo reglamentario, se debe mandar un mensaje de error diciendo que se debe hacer un recorte de personal.

Ahora escribimos en un bloque PL/SQL el siguiente código:

Al ejecutarlo nos saldrá el siguiente resultado:

Como podemos observar, había más empleados de lo requerido y por tal motivo, se lanzó nuestro error haciendo finalizar la ejecución del subprograma y mostrando el número y mensaje que le dimos.

Ahora vamos a hacer este mismo ejemplo, con la diferencia que vamos a ejecutar nuestro procedimiento RAISE_APPLICATION_ERROR desde la sección EXCEPTION y no desde BEGIN.

Si lo ejecutamos obtenemos el mismo resultado.

Última modificación: lunes, 11 de mayo de 2020, 21:13