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

#6 Hugo Gsell
06/07/2006 - 13:22 | Informe spam
avanzando un poco mas... sería posible entonces que mi función o mejor dicho
cada función devolviera una excepción en caso de que se produzca un error
para poder capturarla desde el códio principal?

Esto sería algo así lo que quiero hacer aunque no comprendo muy bien... cómo

clase llamadora
Try
GraboDatos
Catch as exception
' un mensaje de error generado por mi grabo datos
End Try


clase llamada
GraboDatos
'aca va el codigo por ejemplo que ejecuta un procedimiento almacenado
Si todo va bien
RETURN Grabodatosok
Si Algo va Mal
RETUR DevuelvoExepción con error
Fin SI







"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:%23PA%
Mostrar la cita
#7 Leonardo Azpurua [mvp vb]
06/07/2006 - 15:21 | Informe spam
"Hugo Gsell" escribió en el mensaje
news:%
Mostrar la cita
Hola, Hugo:

La estructura genera de un componente responsable de la ejecución de un
proceso es esta:

Public Sub ProcesarTalCosa()
Try
PrepararEntorno
IniciarTransaccion
ProcesoAEjecutar
ConfirmarTransaccion
Catch ex As Exception ' esto puede ser mas complicado
CancelarTransaccion
LevantarExcepcion ' para el proceso que llama
Finally
RestablecerEntornoOriginal
End Try
End Sub

Si cualquier funcion llamada dentro de «ProcesoAEjecutar» produjere una
excepcion, controlada o no, será capturada dentro del bloque del
controlador, que pone todo como estaba al principio y le envia una excepcion
al cliente, que a su vez no tiene mas que hacer que notificarle al usuario.

Private Sub cbProcesar_Click(Sender As Object, e As EventArgs) _
Handles
cbProcesar.Click
Try
ProcesarTalCosa()
ReiniciarForma()
Catch Ex As Excepcion
ManejarExcepcion(Ex)
End Try
End Sub

Donde puse "ManejarExcepcion(Ex)" puedes implementar un manejo de errores
con el nivel de sofisticacion que quieras: desde pasar la excepcion (como
argumento) a una clase que maneje la notificacion al usuario y almacene una
traza para efectos de auditoría de errores (estudia a fondo la estructura de
la clase Exception y de sus derivadas: es sorprendente toda la informacion
que puedes obtener de ellas) hasta ignorarla o abrir un simple cuadro de
mensaje.

Las funciones deberian dejarse *solamente* para calcular y devolver valores
necesarios para la lógica de la aplicación. En la medida de lo posible, los
errores deberían manejarse mediante excepciones.

Salud!
#8 Hugo Gsell
06/07/2006 - 15:56 | Informe spam
Como siempre excelente y simple la respuesta.
Por lo menos así lo veo yo.

Hugo A. Gsell
Sgo del Estero
Argentina

"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
#9 Hugo Gsell
06/07/2006 - 16:46 | Informe spam
una pregunta mas haber digamos que uso dos capas .. presentación y
accesoadatos

En acceso a datos hace algo como

Grabaregistro(parametros a grabar)
abrebase
abretabla
grabadatos
dispose
Finaccesoadatos

ahora bien para que el cath funcione en la capa llamadora.
debo NO PONER CONTROL DE TRY ... CATH en Grabaregistro... supongamos que
ocurre un error al conectarse a la base de datos
Si pongo el control lo captura allá y en mi clicengrabar ni me entero..
ahora si no pongo el control ocurre el error y la captura se trasala al
clcengrabar
¿ESTO ES LO QUE ESTAS PLANTEANDO?
¿CREES QUE ESTÁ BIEN HACERLO ASÍ?



sub clicengrabar
SiControlDatosOk
TRY
Grabaregistro
CATCH ex exception
MSGBOX ex.message
EndTry
FinSi

end sub


Hugo A. gsell
Sgo del Estero
Argentina





"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
#10 Eduardo A. Morcillo [MS MVP VB]
06/07/2006 - 19:40 | Informe spam
La idea es capturar y procesar el error donde sea necesario. Si no se va a
hacer nada con el error entonces este debería pasar al nivel superior y asi
hasta que en algun lugar se lo procese o nos haga caer la aplicacion. Por
ejemplo aqui solo procesaria un tipo de excepcion dejando que las demas
pasen al nivel anterior:

Sub HacerAlgo()

Try

Catch ExcepcionQuePuedoControlarAqui

Finally

End Try

End Sub

Algo a tener en cuenta tambien es que las excepciones son costosas y tienes
que tratar de evitarlas. Por ejemplo en lugar de esperar a que se genere una
excepcion al abrir un archivo te fijas primero si existe. Y en el caso de
tus funciones si no necesitas informacion extra es mejor devolver un valor
no valido que lanzar una excepcion. Por ejemplo si buscas un cliente es
mejor:

cliente = BuscarCliente()

If cliente Is Nothing Then
MsgBox("Cliente no encontrado")
End If

Que:

Try
cliente = BuscarCliente()
Catch ex As ClienteNoEncontradoException
MsgBox("Cliente no encontrado")
End Try


Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
http://mvp.support.microsoft.com/pr...4EF5A4191C
Ads by Google
Search Busqueda sugerida