Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-09-2011
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 21
jsc Va por buen camino
Try/except/finally

Hola,
quisiera saber si podeis ayudarme a controlar posibles fallos en mi aplicación.
en tiempo diseño, constantemente me aparecen excepciones que supongo hacen que la aplicación deje cositas abiertas por ahí, y de vez en cuando, me sale un mensaje:
Código:
falta de memoria
y me obliga a guardar todos los cambios, cerrar todo delphi y volver a abrir todo para seguir trabajando

utilizo codigo del tipo
Código:
TRY EXCEPT
y cuando ejecuto el programa sin estar en modo diseño (sin tener abierto delphi), los comandos que esten puestos en EXCEPT llegan a mostrarse pero hay casos en los que me gustaria saber la manera o forma correcta que deberia programar para mostrar los mensajes correctos y que la aplicación no deje los querys... abiertos y no pueda bloquearme la aplicación... y pueda seguir trabajando; me explico mejor con un ejemplo:
Código:
TRY query1.open;
edit1.text :=query1.fieldbyname ('campo').asstring ;
EXCEPT showmessage ('no se pudo cargar los datos');
END
bueno, por ejemplo, este codigo muestro un mensaje al usuario informandole de que no se puede cargar los datos, porque la por ejemplo en el query no exista el campo "campo"
todo correcto, la cuestion es que posterior a esto, salta una excepción indicando lo mismo en ingles y para mi gusto es algo que no queda nada bien y entiendo que es algo que no tengo controlado o no lo estoy haciendo bien.
podria llegar a poner
Código:
on exception do codigo...
pero quisiera algo general para no tener que controlar todas las excepciones que podria dar.
en el EXCEPT me faltaria poner
Código:
raise
como ultimo comando?
espero haberme explicado y que podais ayudarme
utilizo
Código:
TRY
en operaciones criticas como puedan ser abrir un query, ejecutarlo para actualizar..., cargar datos una vez abierto...
Responder Con Cita
  #2  
Antiguo 12-09-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.474
Poder: 21
newtron Va camino a la fama
Hola.

En el ejemplo que citas si puedes cerrar el query antes del mensaje

Código Delphi [-]
try
  Query1.open;
  Edit1.Text:=Query1.FieldByname('CAMPO').AsString;
except
  Query1.close;
  ShowMessage('No se pudo cargar los datos');
end;

Saludos
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 12-09-2011
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 21
jsc Va por buen camino
try/except/finally

ok,
ahora no puedo probarlo
mañana comento algo al respecto
seria mejor tratar el try con la excepción correcta? con lo que pongo seria suficiente para cualquier operación que se haria con el query o tendría que tratar alguna excepción más?
Código:
TRY 
   query1.open;
   edit1.text := query1.fieldbyname ('CAMPO').asstring ;
EXCEPT On EDatabaseError do
   begin
      query1.close ;
      showmessage ('Error al cargar los datos');
   end;
esto mismo anulando
Código:
on EDatabaseError do
tendría el mismo efecto/resultado?
gracias
Responder Con Cita
  #4  
Antiguo 12-09-2011
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
El "ON" es para filtrar el tipo de excepción, cuando se quiere dar una respuesta diferente para ciertos tipos. Así:
Código Delphi [-]
...
  EXCEPT
    ON Error: EDatabaseError DO
      ShowMessage ('Error en la base de datos.  ¡A saber lo que estabas buscando!');
    ON Error: EInOutError DO
      ShowMessage ('¡Error de entrada y salida!  Chungo lo tienes');
    ON Error: Exception DO
      ShowMessage ('La excepción no es de entrada y salida ni de base de datos.  Aun así, no respires tranquilo');
  END;
Además te permite acceder a los métodos de la excepción, tales como el identificador, el mensaje, etc.

También ten en cuenta que cada bloque filtrará la excepción indicada y todas aquellas de clases derivadas que no hayan sido procesadas ya. Por eso "ON Error: Exception " obtendrá todas las excepciones que no se hayan filtrado. Y por eso es importante el orden en el que se pongan, ya que se pueden ocultar si se ponen en el orden incorrecto (por ejemplo, si pones "ON Error: Exception " la primera, entonces nunca ejecutará el resto).

De todas formas, puedes anidar un "FINALLY" dentro del "EXCEPTION":
Código Delphi [-]
TRY 
  query1.open;
  TRY
    edit1.text := query1.fieldbyname ('CAMPO').asstring ;
  FINALLY
  { Esta línea se ejecuta SIEMPRE, haya o no excepción. }
    query1.close ;
  END;
EXCEPT
  On Error: EDatabaseError DO
    ShowMessage ('Error al cargar los datos: '+Error.Message);
  ON Error: Exception DO
    ShowMessage ('Excepción: '+Error.Message);
END;
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 12-09-2011 a las 20:33:27.
Responder Con Cita
  #5  
Antiguo 12-09-2011
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Poder: 21
jsc Va por buen camino
try/except/finally

Cita:
Empezado por Ñuño Martínez Ver Mensaje
El "ON" es para filtrar el tipo de excepción, cuando se quiere dar una respuesta diferente para ciertos tipos. Así:
Código Delphi [-]
...
  EXCEPT
    ON Error: EDatabaseError DO
      ShowMessage ('Error en la base de datos.  ¡A saber lo que estabas buscando!');
    ON Error: EInOutError DO
      ShowMessage ('¡Error de entrada y salida!  Chungo lo tienes');
    ON Error: Exception DO
      ShowMessage ('La excepción no es de entrada y salida ni de base de datos.  Aun así, no respires tranquilo');
  END;
Además te permite acceder a los métodos de la excepción, tales como el identificador, el mensaje, etc.

También ten en cuenta que cada bloque filtrará la excepción indicada y todas aquellas de clases derivadas que no hayan sido procesadas ya. Por eso "ON Error: Exception " obtendrá todas las excepciones que no se hayan filtrado. Y por eso es importante el orden en el que se pongan, ya que se pueden ocultar si se ponen en el orden incorrecto (por ejemplo, si pones "ON Error: Exception " la primera, entonces nunca ejecutará el resto).

De todas formas, puedes anidar un "FINALLY" dentro del "EXCEPTION":
Código Delphi [-]
TRY 
  query1.open;
  TRY
    edit1.text := query1.fieldbyname ('CAMPO').asstring ;
  FINALLY
  { Esta línea se ejecuta SIEMPRE, haya o no excepción. }
    query1.close ;
  END;
EXCEPT
  On Error: EDatabaseError DO
    ShowMessage ('Error al cargar los datos: '+Error.Message);
  ON Error: Exception DO
    ShowMessage ('Excepción: '+Error.Message);
END;
ok,
muchas gracias me parece muy completo el aporte
un comentario;entiendo que en el segundo try(el anidado) si ocurriera alguna excepción/error al intentar
Código:
 edit1.text:= query1.fieldbyname('campo').asstring
saltaria la excepción del primer TRY sin llegar a ejecutar el FINALLY verdad?
muchas gracias
Responder Con Cita
  #6  
Antiguo 12-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
saltaria la excepción del primer TRY sin llegar a ejecutar el FINALLY verdad?
Hola jsc.

La respuesta ya te la dió Ñuño en el código que mencionás con un comentario:
Código Delphi [-]
 { Esta línea se ejecuta SIEMPRE, haya o no excepción. }

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Capturar Errores con Try, Finally, End GerTorresM OOP 1 23-04-2011 23:16:01
try-try-finally-finally roman Varios 33 20-08-2008 02:27:00
Try Except --finally-- Caral Varios 13 02-10-2006 22:12:24


La franja horaria es GMT +2. Ahora son las 03:04:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi