Foros del Web » Programación para mayores de 30 ;) » Java »

Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Estas en el tema de Cómo usar correctamente excepciones ya sean creadas por el usuario o no. en el foro de Java en Foros del Web. Muy buenas tardes. Abro este post porque nunca sé bien como usar excepciones. ¿Cuándo hay que lanzarlas y cuándo capturarlas? ¿En el main es correcto ...
  #1 (permalink)  
Antiguo 18/06/2010, 10:16
 
Fecha de Ingreso: agosto-2009
Mensajes: 38
Antigüedad: 14 años, 8 meses
Puntos: 1
Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Muy buenas tardes.
Abro este post porque nunca sé bien como usar excepciones.
¿Cuándo hay que lanzarlas y cuándo capturarlas?
¿En el main es correcto lanzarlas? ¿o es mejor capturarlas?
La verdad es que durante la carrera siempre las he usado a mi antojo, pero ahora que voy a presentar el proyecto final de carrera me gustaría hacerlo correctamente.

A ver si alguien puede aclararme un poco este tema.

Un saludo.
  #2 (permalink)  
Antiguo 18/06/2010, 12:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Esa es una pregunta muy abierta así que es difícil de contestar. Además, no todo el mundo está de acuerdo en ese tema en particular así más complicado aún.

Yo lo que suelo hacer es:
.- Tratarlas donde puedo hacer algo con ellas. Suena obvio pero no lo es.
.- Si no las puedo tratar, las dejo "subir" de nivel y a veces las transformo si el tipo no está permitido o no da información suficiente.
.- Si las transformo y lanzo otra excepción, siempre hay que hacer un initCause() con la excepción original para no perder la traza.
.- Las excepciones siempre se tratan, tarde o temprano, aunque solo sea para poner una traza "ocurrio esta excepción".
.- No se deberían dejar salir excepciones por el main, ya que eso aborta el programa de forma brusca. Se trata, se informa del error y se sale de forma ordenada.

Pero como he dicho, esas son mis reglas y en parte son así por que además de crearlos, me toca mantener mis programas en producción y por eso me importa mucho que me dejen trazas y no "casquen" de forma incontrolada.

Cada maestrillo...
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 24/06/2010, 04:59
 
Fecha de Ingreso: agosto-2009
Mensajes: 38
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Muchas gracias por los apuntes.
¿Sería posible capturar dos exceptiones del mismo tipo? Me explico:

Tengo un metodo:
Código PHP:
void metodo1 () throws MiException {
    if () throw new 
MiException ("Exception 1");
    if () throw new 
MiException ("Exception 2");

y el main
Código PHP:
public static void main (String args) {
    try {
    }
    catch (
MiException mE) {
         
mE.printStackTrace();
    }

Según lo tengo programado en el caso de que se produzcan las dos exception en "metodo1" mi main solo procesa la 1º exception ya que cuando metodo1 lanza la 1º sale del metodo.

¿hay alguna forma para que se procesen todas las excepciones?
Un saludo.
  #4 (permalink)  
Antiguo 24/06/2010, 05:35
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 7 meses
Puntos: 188
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Tal y como lo tienes siempre que se lance una excepción saldrá del método. Lo que tienes que hacer para comprobar que se están procesando es generar un caso de prueba en q se cumpla el if de la excepción 2 pero no el de la excepción 1.
  #5 (permalink)  
Antiguo 28/06/2010, 02:14
 
Fecha de Ingreso: agosto-2009
Mensajes: 38
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Hola.
Eso lo he probado y funciona. Mi intención es que cuando ejecute, salgan todas las excepciones que se están produciendo en el programa, no sólo la 1º. La verdad es que no sé si esto se puede hacer.
  #6 (permalink)  
Antiguo 29/06/2010, 04:26
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Wenas

Las excepciones no funcionan así. Se ejecuta 1, cuando salta 1 no sigue procesando nada (excepto el finally)

No se si lo que quieres es sacar traza de la excepcion que ha saltado, y por donde ha ido pasando.

Osea, printStackTrace().

Saludos.
__________________
--
NO. Tu problema no es urgente.

CCFVLS
  #7 (permalink)  
Antiguo 07/07/2010, 03:46
 
Fecha de Ingreso: agosto-2009
Mensajes: 38
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Pues tienes toda la razón, lo que haré será poner las excepciones en orden de importancia, y segun se vayan corrigiendo salte la siguiente hasta que esté bien todo.
Gracias.
  #8 (permalink)  
Antiguo 07/07/2010, 04:34
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Si podés ir almacenando una Collection<Exception>, si las exceptiones van a ser destinadas al Usuario final, también podrías hacer una Collection<String>, donde cada elemento va a ser exception.getMessage();
y finalmente mostrarlas todas juntas.

Ejemplo: cuando completás mal o no completas un formulario, y commiteas la info, este te devuelte un "nick no válido", "contraseñas no coinciden", "tu avatar no me gusta", "fecha no válida"..
estos te pueden ir saliendo de a uno, o bien decirte toooooodos tus errores de una sola vez

Cita:
Iniciado por elAntonie Ver Mensaje
...
Las excepciones no funcionan así. Se ejecuta 1, cuando salta 1 no sigue procesando nada (excepto el finally)...
Esto no es del todo cierto, ya que TRATANDO LA EXCEPTION con un try catch y siendo una exception NO CRITICA para el correcto funcionamiento de programa tu código quedaría algo así

Código PHP:
Ver original
  1. void metodo1 () throws MiException {
  2.     try {
  3.     if () throw new MiException ("Exception 1");
  4.     } catch (MiException ex ) {
  5.        // cada excpetion interrumpe el proceso normal, la linea de ejecución y va directo al catch..
  6.        // pero en este podés decidir si realmente elevás la exception, terminás el método, o si se puede SEGUIR o apilás los mensajes
  7.     }
  8.     try {
  9.     if () throw new MiException ("Exception 2");
  10.     } catch (MiException ex ) {
  11.     }
  12. }

Última edición por FiruzzZ; 07/07/2010 a las 04:48
  #9 (permalink)  
Antiguo 07/07/2010, 09:39
Avatar de alguienmas  
Fecha de Ingreso: mayo-2009
Mensajes: 62
Antigüedad: 14 años, 11 meses
Puntos: 8
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Si lo que buscas es encontrar todas las Exception no debes arrojarlas (throw) debes almacenarla, tal como dice FiruzzZ, claro que yo lo haria distinto.....
Código:
List<Exception> metodo1 () throws MiException {
List<Exception> list =new LinkedList<Exception>();
    if () list.add(new MiException ("Exception 1"));
// en vez de throw new MiException ("Exception 1");
    if () list.add(new MiException ("Exception 2"));
// en vez throw new MiException ("Exception 2");
return list;
}
al ejecutar la funcion te retornara la lista de todas las Exception producidas en esta funcion
  #10 (permalink)  
Antiguo 07/07/2010, 13:27
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Según las reglas de estílo clásicas y las recomendaciones de Sun (ahora Oracle), las excepciones son para lanzarlas. Indican una desviación en el funcionamiento normal por el que se ha de romper el flujo normal de ejecución del programa.

Querer almacenarlas y/o querer tener más de una son síntomas de que se están usando mal.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #11 (permalink)  
Antiguo 07/07/2010, 17:18
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Cita:
Iniciado por GreenEyed Ver Mensaje
Según las reglas de estílo clásicas y las recomendaciones de Sun (ahora Oracle), las excepciones son para lanzarlas. Indican una desviación en el funcionamiento normal por el que se ha de romper el flujo normal de ejecución del programa...
las excepciones son para lanzarlas........... atrapadas y de ser posible tratadas

"..Indican una desviación en el funcionamiento normal por el que se ha de romper el flujo normal de ejecución del programa.."

Estás diciendo que un programa no puede recuperarse de una Exception?
Que solo sirven para ser lanzadas y chau? try? catch? U CAN FIND SOMETHING TO HANDLE IT!

Disculpame pero estás completamente equivocado

Pegale una mirada a este artículo tan simple
http://e-articles.info/t/i/830/l/es/
y después decime de nuevo que las exceptions son para ser lanzadas nomas..
  #12 (permalink)  
Antiguo 08/07/2010, 01:37
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

No se si lo que has escrito es respuesta a mi mensaje, pero sólo quería avisarte que no puedo leer tus mensajes y por tanto no voy a responder, para que no te lo tomes a mal.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #13 (permalink)  
Antiguo 08/07/2010, 02:22
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Cita:
Iniciado por FiruzzZ Ver Mensaje
las excepciones son para lanzarlas........... atrapadas y de ser posible tratadas

"..Indican una desviación en el funcionamiento normal por el que se ha de romper el flujo normal de ejecución del programa.."

Estás diciendo que un programa no puede recuperarse de una Exception?
Que solo sirven para ser lanzadas y chau? try? catch? U CAN FIND SOMETHING TO HANDLE IT!

Disculpame pero estás completamente equivocado

Pegale una mirada a este artículo tan simple
http://e-articles.info/t/i/830/l/es/
y después decime de nuevo que las exceptions son para ser lanzadas nomas..
Donde dice greeneyed que las excepciones no se puedan capturar? Lo que creo que está diciendo es que después de tratarlas (por ejemplo imprimir un stacktrace en un log), las lances para arriba, no las dejes ahi.

usease.
Código:
public void pepe () throws Exception
{
try{
.....
}catch (Exception e)
{
e.printStackTrace(); //por ejemplo
throw e;
}
}
__________________
--
NO. Tu problema no es urgente.

CCFVLS
  #14 (permalink)  
Antiguo 08/07/2010, 05:25
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

El no menciona nada sobre atrapar y tratar.. solo lo que dice Oracle en alguna de sus especificaciones..
Cita:
Iniciado por elAntonie Ver Mensaje
Lo que creo que está diciendo es ..[/code]
Porque no nos basamos en lo que dice y no en lo que cree c/u?

Otra cosa.. no se hace un printStackTrace() DESPUÉS DE TRATARLA.. porque justamente si la estás tratando es porque sos consciente de que podía suceder y si la TRATAS es porque sabés como subsanar, minimizar o resolver ese problema..

No voy a seguir cuestionando las formas en que c/u resuelve, usa, ignora o lanza (hacia no se donde) las exceptions..
Espero que las dudas de Albertito87 hayan sido satisfechas..
Salu2.
  #15 (permalink)  
Antiguo 08/07/2010, 05:39
Avatar de elAntonie  
Fecha de Ingreso: febrero-2007
Mensajes: 894
Antigüedad: 17 años, 2 meses
Puntos: 10
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Cita:
Iniciado por FiruzzZ Ver Mensaje
El no menciona nada sobre atrapar y tratar.. solo lo que dice Oracle en alguna de sus especificaciones..

Porque no nos basamos en lo que dice y no en lo que cree c/u?

Otra cosa.. no se hace un printStackTrace() DESPUÉS DE TRATARLA.. porque justamente si la estás tratando es porque sos consciente de que podía suceder y si la TRATAS es porque sabés como subsanar, minimizar o resolver ese problema..

No voy a seguir cuestionando las formas en que c/u resuelve, usa, ignora o lanza (hacia no se donde) las exceptions..
Espero que las dudas de Albertito87 hayan sido satisfechas..
Salu2.
Hombre, he puesto un printstacktrace a modo de ejemplo (nunca he pensado que tratar una excepcion es escribir una tracita), evidentemente, de lo que creo que esta diciendo greeneyed, que se puede capturar la excepcion, tratarla y LANZARLA.

Pero es cierto, es lo que supongo que quiere decir.



En eso, tienes razon como indicas

Cita:
Iniciado por FiruzzZ Ver Mensaje
Porque no nos basamos en lo que dice y no en lo que cree c/u?
Pero, puestos a basarnos en lo que dice cada uno.... Repito mi pregunta,

Cita:
Iniciado por elAntonie Ver Mensaje
Donde dice greeneyed que las excepciones no se puedan capturar?
Saludos.
__________________
--
NO. Tu problema no es urgente.

CCFVLS
  #16 (permalink)  
Antiguo 08/07/2010, 06:13
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Cómo usar correctamente excepciones ya sean creadas por el usuario o no.

Por aclarar, lo que digo es que las excepciones son para lanzarlas, en el sentido de que no son para crearlas y simplemente almacenarlas como un objeto cualquiera. Por supuesto que después las capturas, las tratas, las dejas pasar o lo que te de la gana. Pero lo que no tiene sentido es crearlas para no lanzarlas, que es justamente lo que proponía el mensaje anterior al mío.

Después del mensaje donde pongo como trabajo yo con las excepciones y que mi mensaje era respuesta justamente al mensaje anterior, pues debería quedar bastante claro excepto si uno se pone a buscarle tres pies al gato.

Pero bueno, por si acaso mis disculpas por la confusión, la próxima vez ya intentaré dejar todo el contexto totalmente detallado o me ahorraré el mensaje, según el día .

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.

Etiquetas: correctamente, excepciones, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:43.