Manejo de Excepciones en transacciones de SQL Server 2005


Hola a todos, pues aquí estoy con una entrega más en esta ocasión les voy a hablar acerca del manejo de excepciones en transacciones de SQL Server 2005.

Una mejora importante que tenemos en SQL Server 2005 es el manejo de errores que  ahora es posible en T-SQL con los bloques TRY/CATCH sin olvidar la sintaxis que utilizamos para las transacciones.

La sintaxis es la siguiente:

BEGIN TRY
     BEGIN TRANSACTION
     Bloque de código SQL a proteger
     COMMIT TRANSACTION
END TRY
BEGIN CATCH
    Código para mostrar el mensaje de la  excepción
     ROLLBACK TRANSACTION
END CATCH

Si ocurre un error dentro de la transacción en un bloque TRY inmediatamente se dirige al bloque CATCH. Para poder regresar la información del error tenemos nuevas funciones en SQL Server, veamos cuales son:

  • ERROR_NUMBER(): Devuelve el número de error.
  • ERROR_MESSAGE(): Devuelve el texto completo del mensaje de error. El texto incluye los valores suministrados para los parámetros sustituibles, como longitudes, nombres de objeto u horas.
  • ERROR SEVERITY(): Devuelve la gravedad del error.
  • ERROR_STATE(): Devuelve el número de estado de error.
  • ERROR_LINE(): Devuelve el número de línea donde se produjo el error.
  • ERROR_PROCEDURE(): Devuelve el nombre del procedimiento donde se produjo el error.

Para ello vamos a crear un ejemplo bastante sencillo en donde vamos a provocar una excepción en una división entre cero para observar el funcionamiento de estas funciones.

BEGIN TRY
    SELECT
5/0 
END TRY
BEGIN CATCH
    SELECT

        ERROR_NUMBER() AS Numero_de_Error,
        ERROR_SEVERITY() AS Gravedad_del_Error,
        ERROR_STATE() AS Estado_del_Error,
        ERROR_PROCEDURE() AS Procedimiento_del_Error,
        ERROR_LINE() AS Linea_de_Error,
        ERROR_MESSAGE() AS Mensaje_de_Error;
END CATCH

El resultado de este ejemplo es el siguiente:

Numero_de_Error

Gravedad_del_Error

Estado_del_Error

Procedimiento_del_Error

Linea_del_Error

Mensaje_de_Error

8134

16

1

NULL

2

Divide by zero error encountered

Una cosa que deben de tomar en cuenta es que los bloques TRY/CATCH no atraparan los errores de compilación o sintaxis, ya que los errores manejados sólo se invocaran en tiempo de ejecución.

Bueno espero que esto les pueda ayudar a sus proyectos y nos vemos la siguiente entrega.

Feliz Codificación!

S@ludos!
Víctor Alameda
MCSD.NET

Published Sunday, December 16, 2007 10:30 AM por VAlameda
Ofrecido por Community Server (Non-Commercial Edition)