PDA

Ver la Versión Completa : Cuando la red falla como capturar error


Mauro®
09-10-2014, 13:43:23
Buenos días a todos.
Necesito saber si alguien me puede dar una mano. Tengo un pequeño programa de gestión de turnos para un consultorio médico, el mismo lo usa la secretaria de los médicos en su pc donde esta la base de datos y el servidor Firebird. Los médicos se conectan desde sus equipos en cada uno de los consultorios para visualizar la lista de pacientes y turnos. El problema es que tienen una red muy inestable y no quieren mejorarla. Lo que necesito hacer es capturar el error cuando un equipo cliente pierde conexión para dar un mensaje personalizado y luego cerrar la aplicación. En vez de recibir el error que dice "Unable to complete network request to ...."
He buscado por el foro pero no encuentro nada. Se que podría usar un componente TAplicationEvent, pero no se como hacerlo para capturar ese error. (Uso Delphi XE3 + Firebird 2.5)

Desde ya quedaré muy agradecido a quien pueda echarme una mano.

Saludos a todos desde Argentina.
Mauro

duilioisola
09-10-2014, 14:04:20
supongo que podrías poner el código que hace la consulta al servidor en un bloque TRY..EXCEPT.
Según el tipo de excepción darás un mensaje u otro.
Intenta producir el error (desconectando el cable de red, por ejemplo) y mira cual es el valor de E.ClassName


try
// Hago consulta al sercidor
ConsultaTurno;
except
on e:Exception do
begin
// Mensaje de error propio
ShowMessage('Se ha producido un error. Se cerrará la aplicación');
// Clase de excepciçon que se ha producido
ShowMessage('Exception class name = '+E.ClassName);
// Mensaje original de la execpción
ShowMessage('Exception message = '+E.Message);
// Cierro la aplciación
Close;
end;
end;

Mauro®
09-10-2014, 14:17:41
Duilio gracias por tu respuesta.
He hecho esto que indicas, pero por cada evento que maneja la conexión con la base de datos debo colocar un Try Except End; queria saber hay alguna manera de monitorear este error a nivel aplicación para no tener que agregar un try en cada evento que accede a los datos.
Existe esto que planteo?

Muchas gracias

Casimiro Notevi
09-10-2014, 15:27:38
Algunos componentes hacen eso, pero no es la solución, es como si le falta una rueda al coche y quieres que haya alguien ocupando su lugar. La solución es ponerle la rueda.
En este caso, obviamente, la solución es arreglar la red, que unos metros de cables, para unos médicos, es poca cosa, seguro que se gastan más en tabaco :D

duilioisola
09-10-2014, 15:36:46
Estoy de acuerdo con Casimiro, pero se que los usuarios no valoran la inversión en infraestructura si se puede "apañar" con parches aquí o allá.

Con respecto a un "capturador de excepciones", creo que puedes hacer esto en tu Formulario principal:


...
private
procedure CapturaErrores(Sender: TObject; e: Exception);
...

procedure TFMPrincipal.FormCreate(Sender: TObject);
begin
...
Application.OnException := CapturaErrores;
...
end;

procedure TFMPrincipal.CapturaErrores(Sender: TObject; e: Exception);
begin
// Mensaje de error propio
ShowMessage('Se ha producido un error no tratada. Se cerrará la aplicación');
// Clase de excepción que se ha producido
ShowMessage('Exception class name = '+E.ClassName);
// Mensaje original de la excepción
ShowMessage('Exception message = '+E.Message);
// Cierro la aplicación
Close;
end;

Mauro®
09-10-2014, 15:39:57
Muchachos gracias por las respuestas.
Duilio efectivamente la ultima solución es la que utilice, para parchear el problema.
Estoy de acuerdo con Uds. que debería resolverse el problema de fondo que es la red, pero... el cliente siempre tiene razón, yo ya les he aconsejado si ellos quieren solucionar el problema ya saben donde esta el mismo.

Desde ya muchas gracias.
Saludos
Mauro