Ver Mensaje Individual
  #5  
Antiguo 12-09-2011
jsc jsc is offline
Miembro
 
Registrado: nov 2003
Posts: 144
Reputación: 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