usando RAISERROR con THROW para lanzar un error del sistema SQL Server

publicado en: Articles | 0

THROW reemplaza RAISERROR en SQL Server y es el método preferido para subir mensajes de error y enviarlos al código de llamada. THROW es en realidad mucho más intuitivo que RAISERROR en cuanto a cómo su código responde a él.

THROW fue creado como un medio para hacer coincidir más estrechamente el código de manejo de errores en los lenguajes de programación actuales. RAISERROR ha existido desde 1998, lanzado por primera vez en SQL Server 7.0., THROW se incluyó por primera vez en SQL Server 2012.

RAISERROR todavía se incluye en las versiones actuales de SQL Server, pero hay diferencias notables entre cómo fluye el SQL cuando se llama a RAISERROR y cuando se llama a THROW. Específicamente, RAISERROR no detiene la ejecución del procedimiento actual, mientras que THROW siempre detiene el procedimiento actual y pasa el error al procedimiento que llama.

THROW like RAISERROR le permite «elevar» errores personalizados, pero detiene inmediatamente el proceso actual y devuelve el error al procedimiento de llamada.,

THROW le permite hacer prácticamente todo lo que RAISERROR permitió, con una notable excepción: THROW no le permite elevar los errores del sistema de SQL Server. Pero si necesita lanzar un error del sistema, todavía puede hacerlo primero usando RAISERROR en un bloque TRY y usando THROW en el bloque CATCH correspondiente para lanzar el error del sistema.

ejemplo:

–la siguiente instrucción produce un error porque THROW no puede lanzar excepciones del sistema:
THROW 40655, ‘Database master cannot be restored.,’, 1;

resultados:

Msg 35100, nivel 16, estado 10, Línea 2
El número de Error 40655 en la instrucción THROW está fuera del rango válido. Especifique un número de error en el rango válido de 50000 a 2147483647.

pero puede evitar esta limitación de tiro de no ser capaz de lanzar excepciones del sistema al usarlo junto con RAISERROR dentro de un bloque TRY/CATCH:

–lanzar excepción del sistema usando RAISERROR primero en un bloque TRY/CATCH.,
BEGIN TRY
PRINT ‘Begin Try’;
RAISERROR (40655, 16, 1);
PRINT ‘End Try’;
END TRY

BEGIN CATCH
PRINT ‘Begin Catch / Before Throwing Error’;
THROW;
PRINT ‘End Catch / After Throwing Error’;
END CATCH;

PRINT ‘After Try/Catch’;

RESULTS:

Begin Try error BEGIN CATCH / before throwing msg 40655, nivel 16, estado 1, línea 3 database ‘master’ no se puede restaurar.,

como puede ver en los resultados, RAISERROR no detiene el flujo del proceso, pero le permite elevar los errores del sistema y lanzar detiene el flujo del proceso y le permite lanzar los errores del sistema que levanta con RAISERROR al proceso de llamada. El uso de las dos instrucciones juntas le permite tener un control total de los mensajes de error y cuándo se devuelven al procedimiento de llamada.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *