miércoles, 15 de julio de 2009

Ventajas y Desventajas de un try...Catch Sql Server 2005

En la edición 2005 de SQL SERVER se implementó el TRY...CATCH de C#, C++, VB.NET, entre otros lenguajes orientados a objectos dentro del motor de base de datos de Microsoft. El mismo viene con la finalidad de mejorar la detención de errores que se realizaban con el @@Error, que nos devolvía 1 si había algún error o 0 si todo se había ejecutado de forma perfecta.

La función @@Errror hacía el reporte, pero no el manejo del mismo, por lo que se desidió implementar un manejador de errores que fuera más o menos estándar. Otra desventaja de la función @@Error es que el empleo apropiado de esta función requiere hacer una comprobación después de cada declaración, de otra manera el valor de la variable se resetea. Ejemplo:

Select 1/0

If @@Error <> 0
Begin
Select @@Error as Error
End
-----------Msg 8134, Level 16, State 1, Line 1Divide byzero error encountered.-----------

Error
0

(1 row(s) affected)

En SQL Server 2005 solo hay que escribir el código dentro del bloque TRY y si lanza una excepción la recibe el bloque CATCH, de esta forma el error puede manejarse dentro del SP sin necesidad de mandar una excepción al que lo llama.

Begin Try
-- Generate divide-by-zero error.

Select 1/0;

End Try
Begin Catch
-- Execute error retrieval routine.
Select
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;

End Catch;

Esto nos indica, que la idea de Microsoft es grandiosa, pero no todo es color de rosa. Dentro de un Try..Catch no podemos tener otro bloques de intrucción dentro de la misma, es decir algunos Begin..End of If..Else dentro del bloque, lo que hace que programaciones pesadas en SQL Server no puedan ser realizadas. Si la idea es realizar simples procedimientos con Insert, Delete o Update, este bloque es excelente.

Ahora, espero que Microsoft haya tomado eso en cuenta en su nuevo motor de base de datos SQL Server 2008, ya que muchos desarrolladores se lo agradeceríamos.

2 comentarios:

Rodrigo Gonzalez Quezada dijo...

A que te refieres con bloques de instrucción dentro de TRY/CATCH de MSSQL? Si te refieres a usar While o If dentro de estos, si es posible usarlos.

Saludos!

Michael Núñez dijo...

Saludos Rodrigo,
Gracias por visitar el blog, dejame explicarte lo que sucede con lo de los bloques de instrucciones.

Lo que quiero decir con bloques de instrucciones dentro de un try/catch de MSSQL 2005 es que no puedes tener varios bloques uno detrás de otro ya que el motor de base de datos no los ejecutas. Ejemplo si tienes las siguientes instrucciones:

begin try
begin
select * from tables
end
--Segunda instrucción
begin
update tables set table = '1'
end
end try
begin catch
--maneja el error.
end catch

la segunda ejecución no es ejecutada por el motor de base de datos, lo mismo que el if else si se ejecuta el if, entonces cualquier sentencia anidada no se toma en cuenta.

Para más información visitar el enlace de microsoft http://msdn.microsoft.com/es-es/library/ms175976.aspx que trata este tema de una forma más detallada.

Saludos,