Skip to content

Control de errores

El bloque TRY-CATCH en Transact-SQL permite manejar errores que puedan ocurrir en un bloque de código.
En el bloque TRY se escribe el código que puede generar errores. Si ocurre un error, el control pasa al bloque CATCH, donde se define cómo manejarlo (mostrar mensajes, registrar el error, etc.).

Esta estructura ayuda a que el código sea más seguro y predecible, permitiendo a los desarrolladores gestionar los errores de forma efectiva.


BEGIN TRY
-- Código que puede generar errores
END TRY
BEGIN CATCH
-- Código para manejar el error
END CATCH

BEGIN TRY
DECLARE @divisor int, @dividendo int, @resultado int
SET @dividendo = 100
SET @divisor = 0
-- Provoca error de división por cero
SET @resultado = @dividendo / @divisor
PRINT 'No hay error'
END TRY
BEGIN CATCH
PRINT 'Se ha producido un error'
END CATCH

Resultado:

Se ha producido un error

FunciónDescripción
ERROR_NUMBER()Devuelve el número de error.
ERROR_SEVERITY()Devuelve la severidad del error.
ERROR_STATE()Devuelve el estado del error.
ERROR_PROCEDURE()Devuelve el nombre del procedimiento almacenado que ha provocado el error.
ERROR_LINE()Devuelve el número de línea en el que se ha producido el error.
ERROR_MESSAGE()Devuelve el mensaje de error.

BEGIN TRY
DECLARE @divisor int, @dividendo int, @resultado int
SET @dividendo = 100
SET @divisor = 0
-- Provoca error de división por cero
SET @resultado = @dividendo / @divisor
PRINT 'No hay error'
END TRY
BEGIN CATCH
PRINT ERROR_NUMBER()
PRINT ERROR_SEVERITY()
PRINT ERROR_STATE()
PRINT ERROR_PROCEDURE()
PRINT ERROR_LINE()
PRINT ERROR_MESSAGE()
END CATCH

Resultado:

8134 -- ERROR_NUMBER
16 -- ERROR_SEVERITY
1 -- ERROR_STATE
-- ERROR_PROCEDURE
17 -- ERROR_LINE
Error de división entre cero. -- ERROR_MESSAGE

La función RAISERROR permite generar mensajes de error personalizados y lanzar errores específicos.
Es útil para validar entradas y mostrar mensajes descriptivos al usuario.

Sintaxis:

RAISERROR ('Mensaje de error', Severidad, Estado)

Ejemplo:

DECLARE @tipo int, @clasificacion int
SET @tipo = 1
SET @clasificacion = 3
IF (@tipo = 1 AND @clasificacion = 3)
BEGIN
RAISERROR (
'El tipo no puede valer uno y la clasificación 3', -- Mensaje de error
16, -- Severidad
1 -- Estado
)
END
  • Severidad: Indica el grado de criticidad del error (0 a 25). Solo puedes asignar valores de 0 a 18. Los errores de 20 a 25 son fatales y cierran la conexión.
  • Estado: Valor entre 1 y 127 para