Ir al contenido


Foto

Manejo de Errores o Excepciones


  • Por favor identifícate para responder
23 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 29 julio 2009 - 08:26

Hola a todos
Uso firebird 2.1, Zeos y Delphi 7

Lo que quiero es poner el codigo para manejar los siguientes errores o excepciones. El codigo que quiero modificar primero es el del login:


delphi
  1. procedure TFRMlogin.BitBtn1Click(Sender: TObject);
  2.  
  3. begin
  4.   DMmonitorenred.ZConmonred.HostName :=ComboBox1.text;
  5.   DMmonitorenred.ZConmonred.Connect;
  6.   If DMmonitorenred.ZConmonred.Connected then
  7.   modalresult :=mrok
  8.   else
  9.   showmessage('incorrecta conexion');
  10.   frmlogin.Show;
  11. end;
  12.  
  13. procedure TFRMlogin.BitBtn2Click(Sender: TObject);
  14. begin
  15. close;
  16. end;



Esto sirve para conectarse a una base de datos en red. y cuando no se conecta me da los siguientes errores:

Imagen Enviada
        [/img]http://http://img233.images...oerror1.jpg   

[img width=800 height=500]http://img444.imageshack.us/img444/8238/manejoerror2.jpg[/img]

http://img444.images...joerror2.jpg 

gracias de antemano




  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 29 julio 2009 - 08:39

Hey Luk, puedes ver el tema de Método para crear ventanas de excepciones personalizadas ;).

Saludos.
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 29 julio 2009 - 08:40

Lo que yo utilizo para el manejo de errores es lo siguiente (ademas de lo recoemndado por enecumene



delphi
  1.   try
  2.     IBDatabase1.Open;
  3.   except
  4.     ShowMessage('Hubo un error al inicializar la conexión con la base de datos.'#13+
  5.                 'Verifique que los datos de acceso a la base sea la correcta'#13+
  6.                 'en el menu Herramientas->Configuración'#13+
  7.                 'Después de modificar los datos, reinicie esta aplicación.');
  8.   end;



Con eso ya no te muestra la excepción y te muestra en su lugar un mensaje digamos mas entendible.

Salud OS
  • 0

#4 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 29 julio 2009 - 11:05



delphi
  1. procedure TFRMlogin.BitBtn1Click(Sender: TObject);
  2.  
  3. begin
  4.   DMmonitorenred.ZConmonred.HostName :=ComboBox1.text;
  5.   try
  6.   DMmonitorenred.ZConmonred.Connect;
  7.   modalresult :=mrok
  8. except
  9.   showmessage('incorrecta conexion');
  10.  
  11. end;
  12. end;



Egostar si lo pongo mas o menos asi como dices, no me sale el mensaje de except y me sale el primer mensaje de error y luego al presionar ignore me sale el segundo. La idea es poder manejar la exception, sin que me saque del programa y voy a crear unos combobox con las posibles bases de datos y enlaces. Pero si no logra conectarse que me de la opcion de poder presionar el boton cerrar del form para salir del programa.
Imagen Enviada


Estoy  tratando de utilizar el codigo de enecumene, pero siempre me sale la ventana de aviso, aunque no haya error.


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 30 julio 2009 - 06:41



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. //¿Estan todas definidas?
  4. DMmonitorenred.ZConmonred.HostName :=ComboBox1.text;
  5. DMmonitorenred.ZConmonred.User := '';
  6. DMmonitorenred.ZConmonred.Pass := '';
  7. DMmonitorenred.ZConmonred.protocol := '';
  8. try
  9.   DMmonitorenred.ZConmonred.Connect;
  10. except
  11.   on E: Exception do
  12.     if E.ClassNameIs('EDatabaseError') then
  13.       begin
  14.       SHowMessage(E.Message);
  15.       Abort;
  16.     end;
  17.   end;
  18. end;



Para ver los resultados del Except es mejor verlo con la aplicación ya construida.

Saludos.
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 30 julio 2009 - 07:17

Eso que dices que te saca del programa solo sucede cuando lo ejecutas desde el IDE si lo haces directamente desde el ejecutable eso no sale
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 30 julio 2009 - 08:48

Yo veo algo que también te puede faltar a la hora de ejecutar el programa



delphi
  1. procedure TFRMlogin.BitBtn1Click(Sender: TObject);
  2. begin
  3.   DMmonitorenred.ZConmonred.HostName :=ComboBox1.text;
  4.   try
  5.     DMmonitorenred.ZConmonred.Connect;
  6.     modalresult := mrok;
  7.   except
  8.     showmessage('incorrecta conexion');
  9.     modalresult : mrNone; // Que va a hacer cuando exista un error.....
  10.   end;
  11. end;



Salud OS
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 30 julio 2009 - 09:47

Otra manera sencilla de personalizar los mensajes de error es utilizando un TApplicationEvents que se encuentra en Additional. Interceptando el evento OnException puedes hacer algo parecido a esto:


delphi
  1. procedure TDatos.ApplicationEvents1Exception(Sender: TObject; E: Exception);
  2. begin
  3. if Pos(UpperCase('Unable to complete Network request to host..'), UpperCase(E.Message)) <> 0 then
  4.   begin
  5. ShowMessage('Lo que tu quieras');
  6. //Código por si quieres hacer algo mas
  7.   end
  8. else if Pos(UpperCase('SQL Server does no exist or access denied..'), UpperCase(E.Message)) <> 0 then
  9.   begin
  10. ShowMessage('Lo que tu quieras');
  11. //Código por si quieres hacer algo mas
  12.   end
  13. // Finalmente capturamos cualquier excepción no prevista
  14. else
  15. ShowMessage('Ocurrió el siguiente error: ' + #13 + E.Message);
  16. end


  • 0

#9 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 30 julio 2009 - 09:52

Cacha todo tipo de errores



delphi
  1.   Try
  2.     Try
  3.         //Bloque de código
  4.       finally
  5.         //bloque a ejecutar cuando finaliza el bloque protegido
  6.         //o cuando se lanza una excepción (útil para liberar objetos creados)
  7.       End;   
  8.   Except
  9.       On Error: Exception do
  10.           showMessage('Ocurrió un error al ejecutar el bloque, contacte al administrador. Error: ' + Error.message);
  11.   End;
  12.  


  • 0

#10 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 30 julio 2009 - 05:49

Gracias a todos por sus respuestas, no habia podido conectarme hoy, pero ahora voy a probar las ideas que me dan
y en un momento les comento como va.



  • 0

#11 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 30 julio 2009 - 06:57

Hola a todos

Le puse el mrNone como dice Egostar y si lo abro desde delphi me saca del programa. Eduarcol tienes razon si lo hago desde el ejecutable, la excepcion funciona y no me saca. Voy a probar todo lo demas para ver la forma en que funciona, pero asi como me  indica egostar y corriendo desde el ejecutable funciona bien.

Código: [Seleccionar]

procedure TFRMlogin.BitBtn1Click(Sender: TObject);
begin
  DMmonitorenred.ZConmonred.HostName :=ComboBox1.text;
  try
    DMmonitorenred.ZConmonred.Connect;
    modalresult := mrok;
  except
    showmessage('incorrecta conexion');
    modalresult : mrNone; // Que va a hacer cuando exista un error.....
  end;
end;

   



-Otra duda como le pongo alguna cosa para que se vea que esta intentando conectarse a para que no se vea como detenido el programa
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 30 julio 2009 - 07:38

-Otra duda como le pongo alguna cosa para que se vea que esta intentando conectarse a para que no se vea como detenido el programa


_Busy.pas de cHackAll ;)

Saludos.
  • 0

#13 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 30 julio 2009 - 11:28

Con la ayuda de todos y los ultimos datos de enecumene van funcionando bien las cosas.  Siguiendo con la misma idea de controlar excepciones. Esta aplicacion, luego de conectarse a la base de datos, se mantiene haciendo consultas practicamente todo el tiempo. Lo que quiero controlar es que si por alguna razon se corta la conexion, el programa me permita ir al login y reconectar o algo asi.

Pregunta: donde poner el try?  despues de cada open de las consultas o en el bloque begin end ?

Aqui esta el codigo del timer:


delphi
  1. procedure TFRMactivasred.Timer1Timer(Sender: TObject);
  2. begin
  3.  
  4.   dmmonitorenred.zqcentral.Close;
  5.   dmmonitorenred.zqcentral.sql.Clear;
  6.   dmmonitorenred.zqcentral.SQL.add('select * from central left join acmsub on central.csid=acmsub.csid left join evento on central.evento=evento.evento') ;
  7.   dmmonitorenred.zqcentral.SQL.Add('where entradadatos > ' + quotedstr(inttostr(buscentral)));
  8.   dmmonitorenred.zqcentral.SQL.Add('order by entradadatos desc');
  9.   dmmonitorenred.zqcentral.open;
  10.  
  11.  
  12. if  dmmonitorenred.zqcentralENTRADADATOS.AsInteger > buscentral then
  13.   begin
  14.     with DMmonitorenred do
  15.     FRMactivasred.ListBox1.Items.Add(zqcentralfechan.AsString+ '  ' + zqcentralDETALLE.AsString +'        ' + zqcentralCSID.AsString + '  ' + zqcentralCLIENTES.AsString + '  ' + zqcentralEVENTO.AsString + '  ' + zqcentralDETALLE_1.AsString + '  ' + ' ' +zqcentralTELEFONO.AsString + '                      entradadatos #  '+ zqcentralENTRADADATOS.AsString  );
  16.     FRMactivasred.ListBox1.Items.Add('  ');
  17.     FRMactivasred.ListBox1.TopIndex := -1 + FRMactivasred.ListBox1.Items.Count;
  18.     buscentral:=dmmonitorenred.zqcentralentradadatos.AsInteger;
  19.     dmmonitorenred.zqcentral.Next;
  20.   end;
  21.  
  22.   dmmonitorenred.zqpendientes.Close;
  23.   dmmonitorenred.zqpendientes.SQL.Clear;
  24.   dmmonitorenred.zqpendientes.SQL.Add('select first 1 * from activas ');
  25.   dmmonitorenred.zqpendientes.SQL.Add(' where alarmnum > ' + quotedstr(inttostr(buscar)) );
  26.   dmmonitorenred.zqpendientes.SQL.Add('order by alarmnum desc');
  27.   dmmonitorenred.zqpendientes.Open;
  28.  
  29.   if dmmonitorenred.zqpendientesalarmnum.ASINTEGER  > buscar then
  30.  
  31.   begin
  32.     dmmonitorenred.zqactivas.Close;
  33.     dmmonitorenred.zqactivas.SQL.Clear;
  34.     dmmonitorenred.zqactivas.SQL.add('select first 100 * from  Activas inner join evento on activas.evento=evento.evento left join acmsub on activas.csid=acmsub.csid ');
  35.     dmmonitorenred.zqactivas.SQL.add(' where completa <> '+ 'COMPLETADA');  //debe ser buscando los que estan pendientes
  36.     dmmonitorenred.zqactivas.SQL.Add('order by alarmnum desc');
  37.     dmmonitorenred.zqactivas.Open;
  38.     SONIDO.Show;
  39.     buscar:=dmmonitorenred.zqpendientesalarmnum.ASINTEGER;
  40.   End;
  41.  
  42. end;
  43.  





  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 31 julio 2009 - 07:06

Hola

Pienso que en este caso especifico yo harí­a lo siguiente



delphi
  1.   if NoHayConexion then  begin
  2.       VolverAConectar;
  3.       dmmonitorenred.zqcentral.open;
  4.   end
  5.   else begin
  6.           dmmonitorenred.zqcentral.open;
  7.   end;



Esto para no perder la secuencia que tienes en tu timer.

Salud OS
  • 0

#15 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 31 julio 2009 - 07:08

Lo que quiero controlar es que si por alguna razon se corta la conexion, el programa me permita ir al login y reconectar o algo asi.

Para esto puedes valerte de dos procedimientos adicionales uno que cierre todos los datasets además de  la conexión con la base de datos(que también te puede ser util en otros escenarios), y otro que vuelva a conectar con la base datos, mas o menos asi  :



delphi
  1. procedure CerrarConexionServidor;
  2. var
  3.   i : Integer;
  4. begin
  5.   for i := 0 to ComponentCount - 1 do
  6.     if Components[i] is ZeosDatasets then//no conozco Zeos, hay que ajustar este detalle
  7.       (Components[i] as ZeosDatasets).Active := False;
  8. ZeosDBConexion.Connected := False;
  9. end;



la reconexión



delphi
  1. procedure ReconectarServidor;
  2. begin
  3.   CerrarConexionServidor;
  4. //Aquí­ puedes pasar el usario y el password y los parámetros que fueren necesarios
  5.   ZeosDBConexion.Connected:= True;
  6. end;



Y puedes llamar el procedimiento ReconectarServidor sólo en caso de que tu procedimiento lance una excepción de pérdida de conexión. O también como dice Egostar primero probar si hay conexión, en caso afirmativo continuar con lo que tienes en el Timer de lo contrario intentar reconectar.



PD: Esta es solo una idea.


Saludos


  • 0

#16 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 31 julio 2009 - 05:38

Gracias Egostar y Wilson por sus respuestas, voy a trabajar con ellas y les comento mas tarde


  • 0

#17 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 05 agosto 2009 - 02:58



delphi
  1. procedure TFRMactivasred.Timer1Timer(Sender: TObject);
  2. begin
  3.  
  4. if not DMmonitorenred.ZConmonred.Connected  then
  5.   try
  6.   DMmonitorenred.ZConmonred.Connect;
  7.   except
  8.     showmessage('incorrecta conexion');
  9.  
  10. end
  11. else
  12. begin
  13.  
  14.   dmmonitorenred.zqcentral.Close;
  15.   dmmonitorenred.zqcentral.sql.Clear;
  16.   dmmonitorenred.zqcentral.SQL.add('select * from central left join acmsub on central.csid=acmsub.csid left join evento on central.evento=evento.evento') ;
  17.   dmmonitorenred.zqcentral.SQL.Add('where entradadatos > ' + quotedstr(inttostr(buscentral)));
  18.   dmmonitorenred.zqcentral.SQL.Add('order by entradadatos desc');
  19.   dmmonitorenred.zqcentral.open;
  20.  
  21.  




y cuando la conexion se corta recibo el siguiente error, repetido muchisimas veces, hasta que abro el taskmgr y cierro el proceso
Imagen Enviada
http://img145.imageshack.us/img145/5711/conexionerror2.jpg 


como puedo corregir el error.
Wilson en cuanto a tus procedimientos, no se todavia como escojer los dataset de zeos que indicas, pero sigo trabajando en ello

  • 0

#18 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 05 agosto 2009 - 04:05

Hola amigo

Lo que veo es que estamos tratando de abrir una conexión que está bloqueada por la deesconexión a la red, por lo que deduzco ( que inteligente se leé eso :p ) que necesitamos algun proceso que cierre la conexión, que en realidad está bloqueda y no cerrada.

Vamos por la lógica



delphi
  1. if not DMmonitorenred.ZConmonred.Connected  then begin
  2.   try
  3.     DMmonitorenred.ZConmonred.Close; //No se si esto funcione con ZEOS
  4.     DMmonitorenred.ZConmonred.Connect;
  5.   except
  6.     showmessage('incorrecta conexion');
  7.   end;
  8. end
  9. else begin
  10.     dmmonitorenred.zqcentral.Close;
  11.     dmmonitorenred.zqcentral.SQL.Text := 'select * from central left join acmsub on central.csid=acmsub.csid '+
  12.                                         ' left join evento on central.evento=evento.evento '+
  13.                                         ' where entradadatos > :BusCentral '+
  14.                                         ' order by entradadatos desc';
  15.     dmmonitorenred.zqcentral.parambyname('BusCentral').AsString := inttostr(buscentral);
  16.     dmmonitorenred.zqcentral.open;
  17. end;



Salud OS
  • 0

#19 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 05 agosto 2009 - 05:58



delphi
  1.   procedure TFRMactivasred.Timer1Timer(Sender: TObject);
  2. begin
  3. if not DMmonitorenred.ZConmonred.Connected  then
  4.  
  5.   try
  6.   DMmonitorenred.ZConmonred.Connected:=false;
  7.   DMmonitorenred.ZConmonred.Connected:=true;
  8.   except
  9.   showmessage('incorrecta conexion');
  10. end
  11. else
  12. begin




Lo hice de esta manera y me da el mismo error, tambien si lo hago poniendo


delphi
  1. DMmonitorenred.ZConmonred.Connect;   



Que puedo hacer con esto?

  • 0

#20 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 agosto 2009 - 08:51

eso significa que no se puede conectar a esa ip.  Si la bd se desconecta se debe primero solucionar el problema que origino la desconexion para que no salga de nuevo el error, lo mas "sano" es cerrar el sistema y volver a abrir,
  • 0




IP.Board spam blocked by CleanTalk.