Buscar..


Observaciones

TRY / CATCH es una construcción de lenguaje específica para T-SQL de MS SQL Server.

Permite el manejo de errores dentro de T-SQL, similar al visto en el código .NET.

Transacción en un TRY / CATCH

Esto hará retroceder ambas inserciones debido a una fecha y hora no válida:

BEGIN TRANSACTION
BEGIN TRY
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, 'not a date', 1)
    COMMIT TRANSACTION
END TRY
BEGIN CATCH        
    ROLLBACK TRANSACTION -- First Rollback and then throw.
    THROW
END CATCH

Esto comprometerá ambas inserciones:

BEGIN TRANSACTION
BEGIN TRY
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    THROW
    ROLLBACK TRANSACTION
END CATCH

Aumento de errores en el bloque try-catch

La función RAISERROR generará un error en el bloque TRY CATCH:

DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
    print 'First statement';
    RAISERROR(@msg, 11, 1);
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
END CATCH

RAISERROR con un segundo parámetro mayor que 10 (11 en este ejemplo) detendrá la ejecución en TRY BLOCK y generará un error que se manejará en el bloque CATCH. Puede acceder al mensaje de error utilizando la función ERROR_MESSAGE (). La salida de esta muestra es:

First statement
Error: Here is a problem!

Generar mensajes de información en el bloque try catch

RAISERROR con severidad (segundo parámetro) menor o igual a 10 no arrojará la excepción.

BEGIN TRY
    print 'First statement';
    RAISERROR( 'Here is a problem!', 10, 15);
    print 'Second statement';
END TRY
BEGIN CATCH    
    print 'Error: ' + ERROR_MESSAGE();
END CATCH

Después de la instrucción RAISERROR, se ejecutará la tercera instrucción y no se invocará el bloque CATCH. El resultado de la ejecución es:

First statement
Here is a problem!
Second statement

Excepción de relanzamiento generada por RAISERROR.

Puede volver a lanzar el error que atrapó en el bloque CATCH utilizando la instrucción TRHOW:

DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
    print 'First statement';
    RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
    THROW;
END CATCH

Tenga en cuenta que en este caso estamos generando errores con argumentos formateados (cuarto y quinto parámetro). Esto puede ser útil si desea agregar más información en el mensaje. El resultado de la ejecución es:

First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'

Excepción de lanzamiento en bloques TRY / CATCH

Puedes lanzar una excepción en el bloque try catch:

DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
    print 'First statement';
    THROW 51000, @msg, 15;
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
    THROW;
END CATCH

Las excepciones se manejan en el bloque CATCH y luego se vuelven a lanzar con el comando THROW sin parámetros.

First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!

THROW es similar a RAISERROR con las siguientes diferencias:

  • La recomendación es que las nuevas aplicaciones deberían utilizar el THROW en lugar del RASIERROR.
  • THROW puede usar cualquier número como primer argumento (número de error), RAISERROR puede usar solo los identificadores en la vista sys.messages
  • THROW tiene gravedad 16 (no se puede cambiar)
  • THROW no puede formatear argumentos como RAISERROR. Use la función FORMATMESSAGE como un argumento de RAISERROR si necesita esta función.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow