Excepcion propia con codigo interno

04/07/2007 - 13:19 por ANT1 | Informe spam
Hola a todos, estaba interesado en crear una excepcion propia para
gestionar las excepciones o alertas que se podrian dar en mi app (que
un NIF de cliente se duplque o que no tenga el formato correcto y
demas).

En principio pense en usar la propia Excpetion o ApplicationException
al ver que tenian la propiedad Data (un idictionary), pero he visto
que esta propiedad solo dispone de metodo Get, no Set. ¿existe alguna
excepcion que se pueda modificar con algun parametro del estilo?, es
decir, una propiedad a la que pueda dar yo un valor para despues
recuperar y dependiendo de ese valor sacar una ventana de informacion
u otra (es para algo mas complejo que sacar solo el mensaje de error).

Habia pensado en algo asi:

public class ExceptionMia:ApplicationException

struct Mensaje
{
string titulo, alerta, mensaje;
image icono;
public Mensaje(string t, string a, string m, imagen i){ titulo = t;
alerta = a; mensaje = m; icono = i; }
}

Dictionary<int, Mensaje> Errores = new Dictionary>in, Mensaje>();
// Aqui llenaria los mensajes que me interesasen en el dictionary, por
ejemplo:
Errores.Add(0,"Error 0","Error En NIF", "El NIF introduccido no es
correcto, por favor revise su valor",
global::aplicacion.Properties.Resources.alerta);
Errores.Add(1,"Error 1","Error Cualquiera","Este es un error
cualquiera que se me
ocurre",global::aplicacion.Properties.Resources.error1);
// ... asi con todos los errores que desee ir añadiendo


private string titulo;

public string Titulo
{
set { titulo= value; }
get { return titulo; }
}

private string alerta;

public string Alerta
{
set { alerta= value; }
get { return alerta; }
}

private string mensaje;

public string Mensaje
{
set { mensaje = value; }
get { return mensaje; }
}


private image imagen;

public image Imagen
{
set { imagen = value; }
get { return imagen; }
}

public ExceptionMia(int codigo):base(null)
{
Mensaje aux = Mensajes[codigo];
this.Titulo = aux.titulo;
this.Alerta = aux.alerta;
this.Mensaje = aux.mensaje;
this.Imagen = aux.icono;
}

public ExceptionMia(int codigo, Exception innere):base(null, innere)
{
Mensaje aux = Mensajes[codigo];
this.Titulo = aux.titulo;
this.Alerta = aux.alerta;
this.Mensaje = aux.mensaje;
this.Imagen = aux.icono;
}

Me gustaria saber vuestra opinion, sobre todo porque no me gusta en
exceso, y no se si funcionaria, la parte del diccionario.

Un saludo.

Preguntas similare

Leer las respuestas

#1 RFOG
04/07/2007 - 13:37 | Informe spam
En la propia MSDN tienes un ejemplo sobre cómo añadir tus valores a dicho
diccionario:

http://msdn2.microsoft.com/es-es/li...ption.data(VS.80).aspx

EL lugar adecuado desde el cual derivar tus propias excepciones es
Exception, tal y como se documenta en la parte de comentarios en
http://msdn2.microsoft.com/es-es/li...nexception(VS.80).aspx.

Y aquí una serie de recomendaciones a seguir:

http://msdn2.microsoft.com/es-es/library/seyhszts(VS.80).aspx



En Wed, 04 Jul 2007 13:19:15 +0200, ANT1 escribió:

Hola a todos, estaba interesado en crear una excepcion propia para
gestionar las excepciones o alertas que se podrian dar en mi app (que
un NIF de cliente se duplque o que no tenga el formato correcto y
demas).

En principio pense en usar la propia Excpetion o ApplicationException
al ver que tenian la propiedad Data (un idictionary), pero he visto
que esta propiedad solo dispone de metodo Get, no Set. ¿existe alguna
excepcion que se pueda modificar con algun parametro del estilo?, es
decir, una propiedad a la que pueda dar yo un valor para despues
recuperar y dependiendo de ese valor sacar una ventana de informacion
u otra (es para algo mas complejo que sacar solo el mensaje de error).

Habia pensado en algo asi:

public class ExceptionMia:ApplicationException

struct Mensaje
{
string titulo, alerta, mensaje;
image icono;
public Mensaje(string t, string a, string m, imagen i){ titulo = t;
alerta = a; mensaje = m; icono = i; }
}

Dictionary<int, Mensaje> Errores = new Dictionary>in, Mensaje>();
// Aqui llenaria los mensajes que me interesasen en el dictionary, por
ejemplo:
Errores.Add(0,"Error 0","Error En NIF", "El NIF introduccido no es
correcto, por favor revise su valor",
global::aplicacion.Properties.Resources.alerta);
Errores.Add(1,"Error 1","Error Cualquiera","Este es un error
cualquiera que se me
ocurre",global::aplicacion.Properties.Resources.error1);
// ... asi con todos los errores que desee ir añadiendo


private string titulo;

public string Titulo
{
set { titulo= value; }
get { return titulo; }
}

private string alerta;

public string Alerta
{
set { alerta= value; }
get { return alerta; }
}

private string mensaje;

public string Mensaje
{
set { mensaje = value; }
get { return mensaje; }
}


private image imagen;

public image Imagen
{
set { imagen = value; }
get { return imagen; }
}

public ExceptionMia(int codigo):base(null)
{
Mensaje aux = Mensajes[codigo];
this.Titulo = aux.titulo;
this.Alerta = aux.alerta;
this.Mensaje = aux.mensaje;
this.Imagen = aux.icono;
}

public ExceptionMia(int codigo, Exception innere):base(null, innere)
{
Mensaje aux = Mensajes[codigo];
this.Titulo = aux.titulo;
this.Alerta = aux.alerta;
this.Mensaje = aux.mensaje;
this.Imagen = aux.icono;
}

Me gustaria saber vuestra opinion, sobre todo porque no me gusta en
exceso, y no se si funcionaria, la parte del diccionario.

Un saludo.






Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Cacarear y no poner huevos, cada día lo vemos.
Respuesta Responder a este mensaje
#2 Alberto Poblacion
04/07/2007 - 14:33 | Informe spam
"ANT1" wrote in message
news:
¿existe alguna
excepcion que se pueda modificar con algun parametro del estilo?, es
decir, una propiedad a la que pueda dar yo un valor para despues
recuperar



Bueno, lo que se hace en estos casos es precisamente lo que indicas en tu
código de ejemplo, es decir, crear tu propia excepción que herede de
System.Exception, y dentro añadirle los datos que quieras devolver como
resultado de la excepción.

Lo que no veo demasiado claro es la parte del Diccionario. En un primer
vistazo no entiendo cómo lo estás manejando. No digo que esté mal,
símplemente que si resulta complejo de entender, puede ser conveniente
buscar alguna forma un poco más clara de organizar la información a
devolver.
Respuesta Responder a este mensaje
#3 ANT1
04/07/2007 - 16:56 | Informe spam
En la propia MSDN tienes un ejemplo sobre cómo añadir tus valores a dicho
diccionario:
http://msdn2.microsoft.com/es-es/li...ption.data(VS.80)...



Gracias RFOG. Habia visto este ejemplo pero no habia terminado de
entenderlo y no me habia dado cuenta del metodo ADD del DATA, como es
logico para añadir valores. No se por que al ver que DATA solo
disponia de metodo GET asumi que no se le podian añadir valores.
Supongo que esta mañana no andaba demasiado despierto.

Aun asi y fijandome mas detenidamente no me terminaria de valer el
DATA al ser un diccionario <string, string>, ya que yo necesito un
conjunto de valores mas complejo, como el struct que puse en mi
ejemplo.

EL lugar adecuado desde el cual derivar tus propias excepciones es
Exception, tal y como se documenta en la parte de comentarios en http://msdn2.microsoft.com/es-es/li...nexception(



Tomo nota.

Y aquí una serie de recomendaciones a seguir:

http://msdn2.microsoft.com/es-es/library/seyhszts(VS.80).aspx



Esto me lo pase por alto. Lo echare un vistazo mas detenidamente.

Visto lo visto, ademas de cambiar la clase de la heredo, no hago ni
tan mal definiendo mi propio dictionary. Lo malo que no me gusta como
esta definido ni como le uso ¿se te ocurre a ti alguna idea mejor?

Un saludo y gracias de nuevo.
Respuesta Responder a este mensaje
#4 ANT1
04/07/2007 - 17:08 | Informe spam
Lo que no veo demasiado claro es la parte del Diccionario. En un primer
vistazo no entiendo cómo lo estás manejando. No digo que esté mal,
símplemente que si resulta complejo de entender, puede ser conveniente
buscar alguna forma un poco más clara de organizar la información a
devolver.



La verdad es que yo no lo tenia muy clar tampoco y al ir a escribirlo
se me retorcio mas y por eso lo colgue aqui antes siquiera de llegar a
usarlo porque no me gusta nada como lo uso.

La idea basicamente era tener dentro de la propia clase de excpcion
propia un diccionario con los posibles tipos de excepcion que yo
manejaria.

Despues a la hora de definir la nueva excepcion a ser lanzada me he
dado cuenta que queda muy retorcido como obtengo los string de alerta,
titulo...

Se me ha ocurrido usar mejor esto y aprovecharme del diccionario que
llevaria la clase y la instancia de por si a la hora de tratar con
dicho objeto en lugar de aprovecharlo solo a la hora de la
construccion.

El diccionario seria creado igual, lo que cambiaria serian los
constructores y las propiedades. Eliminaria las propiedades de string
e imagen que hay ahi y añadiria una unica:

private int codigo;

public int Codigo
{
get { return codigo; }
}

Eliminando el set, solo se fijaria en el constructor mediante el int
que se le pasa, quedando los construcotres de la de siguiente manera
(solo pongo uno):

public ExceptionMia(int codigo):base(null)
{
this.codigo = codigo;
}

Ahora para aprovechar el diccionario ya creado, y a la hora de obtener
el titulo, la alerta, etc... definiria las propiedades:

public string Alerta
{
get { return Errores[this.codigo].alerta; }
}

public string Titulo
{
get { return Errores[this.codigo].titulo; }
}

Y lo mismo con mensaje e icono. De esta manera ademas estas
propiedades son de solo lectura, evitando su modificacion.

La verdad es que esta solucion me gusta mas que la anterior ya que no
hay que repetir propiedades ni nada por el estilo. Lo unico que no me
gusta es tener definido un diccionario que podria ser enorme
(imaginemos que mi aplicacion creciese hasta 50 excepciones propias)
para lugo no utilizar mas que un conjunto de valores de estos.

No veo claro que esto sea lo mas adecuado.

¿Que opinais?

Un saludo.
Respuesta Responder a este mensaje
#5 RFOG
04/07/2007 - 17:21 | Informe spam
En Wed, 04 Jul 2007 16:56:51 +0200, ANT1 escribió:

En la propia MSDN tienes un ejemplo sobre cómo añadir tus valores a
dicho
diccionario:
http://msdn2.microsoft.com/es-es/li...ption.data(VS.80)...



Gracias RFOG. Habia visto este ejemplo pero no habia terminado de
entenderlo y no me habia dado cuenta del metodo ADD del DATA, como es
logico para añadir valores. No se por que al ver que DATA solo
disponia de metodo GET asumi que no se le podian añadir valores.
Supongo que esta mañana no andaba demasiado despierto.



Esas cosas nos pasan a todos.

Claro, el método es para obtener la instancia del diccionario, es de sólo
lectura para evitar que cambies el diccionario completo, pero el
diccionario en sí es de lectura/escritura.


Aun asi y fijandome mas detenidamente no me terminaria de valer el
DATA al ser un diccionario <string, string>, ya que yo necesito un
conjunto de valores mas complejo, como el struct que puse en mi
ejemplo.

EL lugar adecuado desde el cual derivar tus propias excepciones es
Exception, tal y como se documenta en la parte de comentarios en
http://msdn2.microsoft.com/es-es/li...nexception(



Tomo nota.

Y aquí una serie de recomendaciones a seguir:

http://msdn2.microsoft.com/es-es/library/seyhszts(VS.80).aspx



Esto me lo pase por alto. Lo echare un vistazo mas detenidamente.

Visto lo visto, ademas de cambiar la clase de la heredo, no hago ni
tan mal definiendo mi propio dictionary. Lo malo que no me gusta como
esta definido ni como le uso ¿se te ocurre a ti alguna idea mejor?




No tienes por qué añadir un nuevo diccionario, puedes simplemente añadir
un dato miembro de tu estructura, te defines un constructor de copia para
la misma y listo.

O si el icono es un icono de error de una serie predefinida, defines un
array de iconos estáticos a tu excepción (mejor a la clase más base de tu
jerarquía de excepciones), y sólo tienes que pasar el índice del icono,
ahorrando una buena espuerta de memoria.

Ahora, lo que no tengo tan claro es lo correcto que pueda ser elevar una
excepción porque un DNI esté duplicado, etc. Más bien eso creo (y sólo
creo, ya me meto en aguas que desconozco) que debería hacerlo el gestor de
bases de datos.

Yo personalmente, ante una situación como la que presentas no elevaría una
excepción (que son caras en tiempo de ejecución, no el disparo ni el
bloque try, sino la captura y elevación), sino que daría un mensaje de
error y dejaría reintentar o algo así. Pero ya te digo que esto
simplemente es una opinión.

Un saludo y gracias de nuevo.






Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
Cacarear y no poner huevos, cada día lo vemos.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida