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

#11 ANT1
12/07/2007 - 10:02 | Informe spam
On 4 jul, 18:18, RFOG wrote:
Mostrar la cita
La excepcion no la lanzo desde la ficha, si te refieres con "ficha" al
formularioque se muestra por pantalla. Estas excepciones las lanzo
desde las clases mapeadas a mi base de datos. En lo metodos Save,
Delete,... hago una serie de comprobaciones pertinentes y si hay algun
error lanzo la excepcion que es recogida por el formulario que
solicito el Save de alguna de dichas clases y el que se encargaria de
mostrar por pantalla el error (ya sea mediante messagebox o mediante
el formulario mio que te comentaba en el comentario anterior).

Mostrar la cita
Hasta ahora trabajaba asi, pero me han pedido que sea la clase mapeada
la que se encargue de realizar las comparaciones (el "if(datosMal)").
Por lo visto quieren que sea la clase la que se encargue de
practicamente todo, para poder migrar si fuese necesario despues dicha
clase a una app web o a otra app sin tener que copiar codigo de los
formularios que se muestran por pantalla.
#12 ANT1
12/07/2007 - 10:11 | Informe spam
Mostrar la cita
Habia pensado en lo que comentaba con RFOG. Poner el Diccionario en
otra clase de manera estatica, y con su comentario ponerlo en una
clase ExcepcionBase.

El problema como comento antes es como definir los valores a dicho
diccionario. No termino de verlo, y seguramente es porque nunca habia
estado en esta situacion a la hora de programar.

Si se te ocurre algo...

Un saludo
#13 RFOG
12/07/2007 - 10:24 | Informe spam
Mostrar la cita
En C++/CLI existe el constructor estático, que debe ser privado y
estático; en C# supongo que sería así:

class c
{
private static int[] enteros;
private static c()
{
enteros=new int[3] {1,2,3};
}
public c()
{
...
}

Ese constructor se llama únicamente una sola vez en el primer acceso a
cualquier objeto de dicha clase, y su única función es la de inicializar
las variables estáticas complejas (o una forma de juntar todas las
inicializaciones estáticas y no tenerlas desperdigadas por toda la
definición de la clase), y, en determinadas situaciones, es la única forma
de construir objetos complejos estáticos.

Ahí es donde debes inicializar la lista de bitmaps y/o lo que quieras.
Mostrar la cita
Ya. Algo así:

void BotonGuardarEvent()
{
if(ALGO_MAL)
throw new MiExcepcion(tipoError,bla,bla)
else
Graba();
}

Una vez que estás en la excepción, ¿cómo vuelves al manejador del botón?

¿No sería mejor algo así?:

void BotonGuardarEvent()
{
if(ALGO_MAL)
MiMensaje.Muestra(tipoError,bla, bla)
}
else
Graba();
}

Es lo mismo, exactamente lo mismo, pero con la ventaja de que sigues en la
ficha.

Con el código de arriba, una vez que has lanzado la excepción, ésta ser
recoge en el bloque catch más cercano, y ya no puedes volver a la ficha, a
no ser que uses algo así:

void BotonGuardarEvent()
{
try
{
if(ALGO_MAL)
throw new MiExcepcion(tipoError,bla,bla)
else
Graba();
}catch(MiExcepcion e)
{
...
}
}

Que no sé si funcionará (es decir el bloque catch te cogería la excepción
lanzada arriba, o será un catch superior el que lo haga), y si funcionara
sería, IMHO, una tontería como un castillo, mucho código, mucho tiempo de
ejecución para nada. Recuerda la Navaja de Occam: lo más sencillo es
siempre lo mejor.

Quizás se me escape algo, pero lo veo así.



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
Hay que escuchar a la razón, pero dejar hablar al sentimiento.
#14 RFOG
12/07/2007 - 10:26 | Informe spam
Vale. Ahora sí que lo entiendo.

No hagas caso de la última parte de mi mensaje anterior.

En Thu, 12 Jul 2007 10:02:31 +0200, ANT1 escribió:
Mostrar la cita
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
Hay que escuchar a la razón, pero dejar hablar al sentimiento.
#15 ANT1
12/07/2007 - 11:33 | Informe spam
Mostrar la cita
No termino de comprenderlo yo ahora.

¿Seria necesario dentro del constuctor publico llamar al constructor
estatico?¿o es que se llama automaticamente, como comentas, en cuanto
se hace referencia a dicha clase?
Ads by Google
Search Busqueda sugerida