Unidad 9. Programación en TRANSACT SQL (VII)


Recuperar información sobre errores

En el ámbito de un bloque CATCH, se pueden utilizar las siguientes funciones del sistema para obtener información acerca del error que provocó la ejecución del bloque CATCH:

Estas funciones devuelven NULL si se las llama desde fuera del ámbito del bloque CATCH. Con ellas se puede recuperar información sobre los errores desde cualquier lugar dentro del ámbito del bloque CATCH. Por ejemplo, en la siguiente secuencia de comandos se muestra un procedimiento almacenado que contiene funciones de control de errores. Se llama al procedimiento almacenado en el bloque CATCH de una construcción TRY…CATCH y se devuelve información sobre el error.

Ejemplo, vamos a definir un procedimiento para calcular el precio unitario a partir de un importe y una cantidad:


    -- Verificamos que el procedimiento  que vamos a crear no existe.

      IF OBJECT_ID ('CalculaPrecio', 'P' )  IS NOT NULL 

           DROP PROCEDURE CalculaPrecio;

      GO

      -- Creamos el procedimiento

      CREATE PROCEDURE CalculaPrecio @importe  MONEY,@cant INT,@precio MONEY OUTPUT

      AS 

      BEGIN TRY

           SELECT @precio=@importe/@cant;

      END TRY

      BEGIN CATCH

      IF  ERROR_NUMBER() = 8134 SELECT @precio=0

      ELSE  SELECT ERROR_NUMBER() as ErrorNumero,ERROR_MESSAGE() as MensajeDeError;

      END CATCH;

      GO

      -- Lo utilizamos

      DECLARE @resultado MONEY

      EXEC CalculaPrecio 1000, 0,  @resultado OUTPUT

      SELECT 'resul', @resultado  

Si al llamar al procedimiento le pasamos una cantidad igual a cero, la división provocará un error, se pasará el control al bloque CATCH, en este bloque se evalúa si el error corresponde al error de división por cero (8134), si es así el procedimiento devuelve un precio igual a cero, sino se envía un mensaje para avisar del error.

Errores controlados por TRY…CATCH

TRY…CATCH  detecta todos los errores de ejecución que tienen una gravedad mayor de 10 y que no cierran la conexión de la base de datos.
TRY…CATCH no detecta:

Estos errores se devuelven al nivel de ejecución del lote, procedimiento almacenado o desencadenador.
En el ejemplo siguiente se muestra cómo la construcción TRY…CATCH no captura un error de resolución de nombre de objeto generado por una instrucción SELECT, sino que es el bloque CATCH el que lo captura cuando la misma instrucción SELECT se ejecuta dentro de un procedimiento almacenado (a un nivel inferior).


    USE Gestion;

    GO

    BEGIN TRY

       SELECT * FROM TablaQueNoExiste;

    END TRY

    BEGIN CATCH

       SELECT ERROR_NUMBER() as ErrorNumero,ERROR_MESSAGE() as MensajeDeError;

    END CATCH 

Intentamos ejecutar una SELECT de una tabla que no existe en la base de datos. El error no se captura y el control se transfiere fuera de la construcción TRY…CATCH, al siguiente nivel superior, en este caso salta el mensaje de error del sistema.
Al ejecutar la misma instrucción SELECT dentro de un procedimiento almacenado, el error se producirá en un nivel inferior al bloque TRY y la construcción TRY…CATCH controlará el error.


    IF OBJECT_ID  ('TablaInexistente','P') IS NOT NULL 

       DROP PROCEDURE TablaInexistente;

    GO

    -- Creamos el procedimiento.

    CREATE PROCEDURE TablaInexistente

    AS

       SELECT * FROM TablaQueNoExiste;

    GO

    -- Utilizamos el procedimiento

    BEGIN TRY

       EXECUTE TablaInexistente

    END TRY

    BEGIN CATCH

       SELECT ERROR_NUMBER() as ErrorNumero,ERROR_MESSAGE() as MensajeDeError;

    END CATCH; 

En este caso como el error se produce dentro del procedimiento, el control del error se devuelve al nivel superior (el que ha realizado el EXECUTE) por lo que es capturado por el TRY y entra en el bloque CATCH, en vez de que salte el mensaje de error del sistema saldrá el nuestro.

Ejercicios paso a paso Realiza el siguiente Ejercicio Procedimientos para poner en práctica los procedimientos y las estructuras de control de flujo que acabas de estudiar.

Febrero-2010
Pág. 9.7

Atrás  Inicio  Adelante





Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies


© aulaClic S.L. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.