clase error

04/07/2006 - 13:23 por Hugo Gsell | Informe spam
Como me he cansado un poco de manipular los errores he decidido crear mi
propia clase de error.

Esto es, en las distintas capas, especialmente en las de acceso a datos y
negocio, se tendrán muchas funciones que devolverán un valor, o un conjunto
de valores. Este valor puede representar por ej. si se cumple alguna
condicion (de regla de negocio), o si un registro existe, o si se pudo
realizar la grabación de una transacción compleja (o no), etc, etc.
El tema es, que si se produce un error, una politica de acción sería por ej.
que la función nos devolviera falso y que el mensaje de error apareciera 'en
la capa donde se produjo el error'. Pero además sería interesante que la
capa llamadora pueda obtener alguna información adicional sobre el error
producido... aquí entra mi idea de 'crear un objeto' genérico que además
de la información solicitada a la funcion nos devolviera detalles del
problema producido, objeto del error, numero interno de error, tal ves un
nro propio de error, descripción del error, etc.
¿Alguien ha hecho algo de esto?
¿Los objetos existentes tienen alguna propiedad error ó algun mecanismo que
simule lo que propongo?
Esta pregunta viene a lo siguiente... por ejemplo si creo un procedure en
capa de datos que me devuelva un objeto DataTabla
Public sub RecuperoDatos as DataTable el objeto data table ¿no tiene
algun objeto errors o algo similar que pueda utilizar para 'meter' el error
que se produjo?


Hugo A. Gsell
Sgo del Estero
Argentina

Preguntas similare

Leer las respuestas

#11 Leonardo Azpurua [mvp vb]
07/07/2006 - 03:00 | Informe spam
"Hugo Gsell" escribió en el mensaje
news:
Mostrar la cita
Hola.

Me parece tan bien que es como lo hago normalmente :-)

Trabajo mucho con el concepto de separacion Vista-Controlador-Modelo. La
"vista" equivale a la capa de presentación del modelo ortodoxo; en el
"modelo" están las entidades del dominio (comunes a todo un universo de
aplicaciones: clientes, cuentas, bancos, productos, interfaces genericas
como documentos comerciales, entidades, personas, etc) y las entidades de
aplicacion (generalmente derivadas de las interfaces genericas del dominio).
Y en los controladores se implementan las interacciones entre estas
entidades para la ejecución de las operaciones. La lógica y las politicas
del negocio afectan primordialmente estas operaciones. Las operaciones de
acceso a datos forman parte de cada entidad.

En los controladores es donde se ejecutan todos los procesos no atómicos
(como la creación de un cliente o la actualizacion de los datos de un
producto).

Un ejemplo de controlador podria ser asi:

Try
Dim cmd As Command = AppEnvironment.GetCommand()
Factura.StartProcess(cmd)
For Each Det As DetalleFactura In Detalles
Factura.AddDetalle(Det, cmd)
Next
Factura.EndProcess(cmd)
cmd.Transaction.Commit()
Catch ex As Exception
Factura.Reset()
cmd.Transaction.Rollback()
errHandler.Handle(ex)
Finally
cmd.Dispose()
End Try

Pero hay errores "recuperables" que tambien disparan excepciones, y que es
mejor manejar localmente.

Por ejemplo, vas a actulizar un registro que ha sido modificado dentro de
una transacción larga, y todos los mecanismos de reintento intrinseco
expiran. Supongamos que existe la funcion ErrorBloqueo(ex As Exception) que
devuelve True si la excepcion corresponde a un error de bloqueo y False si
su causa es cualquier otra.
Si vas a realizar una actualizacion, podrias escribir:

Errores = 0
Do
Try
cmd.ExecuteNonQuery()
Errores = 0
Catch ex As Exception
If ErrorBloqueo(ex) Then
Errores += 1
If Errores > MAX_INTENTO Then
Throw New Exception("Error de bloqueo", ex)
End If
End If
End Try
Loop While Errores

En el bloque Try..Catch tratas de resolver el problema. Si despues de
intentarlo una cantidad razonable de veces no lo logras, tiras la excepcion
hacia arriba.

Realmente no se si esta sea la mejor manera de manejar los errores. Es
simple, segura, y hasta ahora me ha funcionado.


Salud!
#12 Leonardo Azpurua [mvp vb]
07/07/2006 - 13:28 | Informe spam
"Leonardo Azpurua [mvp vb]" <l e o n a r d o (arroba) m v p s (punto) o r g>
escribió en el mensaje news:
Mostrar la cita
Hay un error. Lo correcto sería:

Do
Try
cmd.ExecuteNonQuery()
Errores = 0
Catch ex As Exception
If ErrorBloqueo(ex) Then
Errores += 1
If Errores > MAX_INTENTO Then
Throw New Exception("Error de bloqueo", ex)
End If
Else
Throw
End If
End Try
Loop While Errores

Salud!
Ads by Google
Search Busqueda sugerida