Microsoft SQL Server
TRATA DE ATRAPARLO
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.