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.
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.
Realiza el siguiente Ejercicio Procedimientos para poner en práctica los procedimientos y las estructuras de control de flujo que acabas de estudiar.
Síguenos en: Facebook Sobre aulaClic Política de Cookies
© aulaClic. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.