Share via


THROW (Transact-SQL)

Produce una excepción y transfiere la ejecución a un bloque CATCH de una construcción TRY...CATCH en SQL Server 2012.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

Sintaxis

THROW [ { error_number | @local_variable },
        { message | @local_variable },
        { state | @local_variable } ] 
[ ; ]

Argumentos

  • error_number
    Es una constante o una variable que representan la excepción. error_number es de tipo int y debe ser mayor o igual que 50000 y menor o igual que 2147483647.

  • message
    Es una cadena o una variable que describe la excepción. message es de tipo nvarchar(2048).

  • state
    Es una constante o una variable comprendida entre 0 y 255 que indica el estado que se ha de asociar al mensaje. state es de tipo tinyint.

Comentarios

La instrucción anterior a la instrucción THROW debe ir seguida del terminador de instrucción punto y coma (;).

Si una construcción TRY...CATCH no está disponible, la sesión se finaliza. Se establecen el número de línea y el procedimiento donde se produce la excepción. La gravedad se establece en 16.

Si la instrucción THROW se especifica sin parámetros, debe aparecer dentro de un bloque CATCH. Esto hace que se produzca la excepción detectada. Cualquier error que se produzca en una instrucción THROW hace que el lote de instrucciones se finalice.

Diferencias entre RAISERROR y THROW

En la siguiente tabla se enumeran algunas diferencias entre las instrucciones THROW y RAISERROR.

Instrucción RAISERROR

Instrucción THROW

Si se pasa un msg_id a RAISERROR, el identificador se debe definir en sys.messages.

El parámetro error_number no tiene que definirse en sys.messages.

El parámetro msg_str puede contener estilos de formato de printf.

El parámetro message no acepta el formato de estilo de printf.

El parámetro severity especifica la gravedad de la excepción.

No hay ningún parámetro severity. La gravedad de la excepción siempre está establecida en 16.

Ejemplos

A.Usar THROW para generar una excepción

En el siguiente ejemplo se muestra cómo utilizar la instrucción THROW para producir una excepción.

THROW 51000, 'The record does not exist.', 1;

El conjunto de resultados es el siguiente.

Msg 51000, Level 16, State 1, Line 1

The record does not exist.

B.Usar THROW para generar de nuevo una excepción

El siguiente ejemplo muestra cómo utilizar la instrucción THROW para generar de nuevo la última excepción THROWN.

USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
(    ID INT PRIMARY KEY
);
BEGIN TRY
    INSERT dbo.TestRethrow(ID) VALUES(1);
--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.
    INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH

    PRINT 'In catch block.';
    THROW;
END CATCH;

El conjunto de resultados es el siguiente.

PRINT 'In catch block.';

Msg 2627, Level 14, State 1, Line 1

Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.

The statement has been terminated.

C.Usar FORMATMESSAGE con THROW

En el ejemplo siguiente se muestra cómo usar la función FORMATMESSAGE con THROW para producir un mensaje de error personalizado. En el ejemplo se crea primero un mensaje de error definido por el usuario mediante sp_addmessage. Como la instrucción THROW no permite parámetros de sustitución en el parámetro message de la manera en que lo hace RAISERROR, la función FORMATMESSAGE se emplea para pasar los tres valores de parámetro esperados por el mensaje de error 60000.

EXEC sys.sp_addmessage
     @msgnum   = 60000
,@severity = 16
,@msgtext  = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).'
    ,@lang = 'us_english'; 
GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string'); 

THROW 60000, @msg, 1; 

El conjunto de resultados es el siguiente.

Msg 60000, Level 16, State 1, Line 2

This is a test message with one numeric parameter (500), one string parameter (First string), and another string parameter (second string).

Vea también

Referencia

FORMATMESSAGE (Transact-SQL)

ERROR_LINE (Transact-SQL)

ERROR_MESSAGE (Transact-SQL)

ERROR_NUMBER (Transact-SQL)

ERROR_PROCEDURE (Transact-SQL)

ERROR_SEVERITY (Transact-SQL)

ERROR_STATE (Transact-SQL)

RAISERROR (Transact-SQL)

@@ERROR (Transact-SQL)

GOTO (Transact-SQL)

BEGIN...END (Transact-SQL)

XACT_STATE (Transact-SQL)

SET XACT_ABORT (Transact-SQL)

Conceptos

Niveles de gravedad de error del motor de base de datos