Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   try (https://www.clubdelphi.com/foros/showthread.php?t=36611)

chipsoni 18-10-2006 13:11:05

try
 
Lo que quiero hacer es muy sencillo y no entiendo que hago mal.
Quiero poder borrar una entrada a una tabla, pero tengo otra tabla que la usa como clave foranea y evidentemente salta una excepcion.
Quiero capturar esa excepcion y lanzar un mensaje que diga que esa entrada no se puede borrar.
Pongo el try al principio del codigo que quiero controlar y despues pongo un:

try
{codigo a controlar}
except
on EMySqlException do showmessage('mi mensaje personalizado');
end;

y sigue no funciona, salta el mensaje de excepcion del mysql y casca la aplicacion, ¿que hago mal?.

mensana 18-10-2006 13:29:25

Cita:

Empezado por chipsoni

try
{codigo a controlar}
except
on EMySqlException do showmessage('mi mensaje personalizado');
end;

Posibilidad 1:
El código no lanza excepciones. Si ocurre esto, entonces debes revisar los eventos de error de la tabla/query/dataset/...

Posibilidad 2:
La excepción generada no es la que intentas capturar. Para comprobarlo, puedes capturar todas las excepciones (usando la clase "Exception") y comprobar el valor de E.ClassName.

chipsoni 18-10-2006 14:06:32

Pues si que lanza una excepcion, porque peta la aplicacion y sale una ventana diciendo exactamente que no puedo borrar una linea padre, porque hay otra tabla que la usa y me da el nombre de excepcion EMySqlException y hasta el numero de exception, justo cuando peta, pero claro, el mensaje es muy tecnico para lanzarselo al cliente final y ademas es que me peta la aplicacion y esa no es la idea.

Quiero capturarlo, lanzarle un mensaje mas amigable y no borrar la entrada.

¿Alguna otra idea?, me he leido toda la ayuda del delphi y sigo sin encontrar el fallo.

Muchas gracias.

Lepe 18-10-2006 14:28:59

Será mejor que pegues el código exacto. Lo que ocurre es la posiblidad 1 pero con una variante, las instrucciones en {codigo a controlar} realmente no lanzan la excepción, sino que dicha excepción se produce como fallo colateral de ese código a controlar

Sería muy conveniente decir qué base de datos usas, qué componentes usas para acceder a esas tablas (BDE, ADO, IBX, etc) y el código exacto que estas usando; ya que la filosofía que usas es la correcta, pero puede haber detalles que se escapen.

Saludos

kalimero 18-10-2006 14:48:46

Hola.
Código Delphi [-]
try
  //codigo a controlar
except
  on E:Exception do
  begin
   Dataset.cancel;
   Showmessage('Mensaje personalizado');
  end;
end;
De todas forma,tal y como dice Lepe, serai conveniente que dieras mas informacion: Sistema deBD,componentes,etc,etc

Saludos

epuigdef 18-10-2006 15:03:40

Buenas!

A parte de lo que te han comentado, ten en cuenta que si ejecutas el programa desde el IDE de Delphi te va a saltar el mensaje "feo" de todas formas. Prueba de ejecutar la aplicación desde fuera del IDE y a lo mejor ves que no es tal error. El lanzamiento de las excepciones dentro del IDE se pueden deshabilitar, pero no recuerdo cómo.

Un saludo

Edu

kalimero 18-10-2006 15:16:03

Hola.
Asi:
Tools->Debugger Options->Languaje Excetions y desmarcar el check
"Stop on Delphi Exceptions".

saludos

chipsoni 18-10-2006 16:56:26

Este es el codigo exacto

try
with Query do
begin
SQL.Clear;
SQL.Add('delete from tactividad');
SQL.Add('where (nombre like :nombre)');
ParamByName('nombre').AsString := DBLCBseleccion.Text;
Execute;
end;
ShowMessage('La actividad '+DBLCBseleccion.Text+' ha sido eliminada');
except
on EMySqlException do showmessage('La actividad empresarial no puede ser eleminada');
end;

Y el error en tiempo de ejecucion es:

"Project Vicerrectorado.exe raised exception class EMySqlException with message '#23000No puede deletear una linea padre: falla la clave extrajera constraint.' Process stopped. Use Step or Run to continue"

La base de datos es MySql y la entrada a la tabla tactividad tiene como clave primaria un codigo que en la tabla tempresa se usa en el campo actividad.
El error salta cuando intento borrar una actividad empresarial y hay alguna empresa que tiene en actividad el codigo de dicha actividad empresarial y en ese caso lo que quiero es que esa actividad no se pueda borrar.

La actividad la selecciono de un DBLookUpComboBox que muestra el campo nombre de la tabla tactividad.

Para accedere a las tablas uso la componente MyDAC.

No se si se me olvida alguna de las cosas que me han preguntado. Espero que ahora sea mas facil saber en que me equivoco.

kalimero 18-10-2006 17:48:07

Código Delphi [-]
try
  with Query do
  begin
    SQL.Clear;
    SQL.Add('delete from grocs');
    SQL.Add('where (nombre like :nombre)');
    ParamByName('nombre').AsString := '1';
    Execute;
  end;
  ShowMessage('La actividad '+DBLCBseleccion.Text+' ha sido eliminada');
except
  on E:EMySqlException do showmessage('La actividad empresarial no puede ser eleminada');
end;

chipsoni 19-10-2006 14:15:29

Esa modificación me da un error de compilación:

Identificador EMySqlException undeclared y EMySqlException es de la clase Exception y ya esta definido, ¿tengo que redefinir un tipo que ya esta definido?

chipsoni 19-10-2006 14:56:54

Se me olvidaba, si pongo Exception, en lugar de EMySqlException, compila, pero sigue dando el mismo problema, la aplicación casca y salta el mensaje predeterminado de la excepción.

kalimero 19-10-2006 15:01:10

Bueno, a ver si esto ya "chuta"
Código Delphi [-]
try
  with Query do
  begin
    SQL.Clear;
    SQL.Add('delete from tabla');
    SQL.Add('where (nombre like :nombre)');
    ParamByName('nombre').AsString := 'cadena';
    Execute;
  end;
  ShowMessage('La actividad '+DBLCBseleccion.Text+' ha sido eliminada');
except
  on E:EMyError do showmessage('La actividad empresarial no puede ser eleminada');
end;
Pero para que todos esto funcione debes añadir en la clausula "uses": MyClasses
En la ayuda de los comnponente tienes abundate informacion sobre el tema
Saludos

mensana 19-10-2006 15:04:14

Cita:

Empezado por chipsoni
...No puede deletear una linea padre: falla la clave extrajera constraint.' Process stopped. Use Step or Run to continue"

Tienes activado "Break on exception" en el IDE.

chipsoni 20-10-2006 11:34:59

memsana, ¿como se accede al ide para desactivar el break on exception?.
Perdona por ni otrpeza, pero he buscado por todas partes.

epuigdef 20-10-2006 11:37:49

Buenas!

Kalimero lo respondió antes:

Cita:

Hola.
Asi:
Tools->Debugger Options->Languaje Excetions y desmarcar el check
"Stop on Delphi Exceptions".
Edu

mensana 20-10-2006 11:37:51

Tools / Debugger options / Language exceptions / Stop on Delphi exceptions

chipsoni 20-10-2006 11:58:25

Muuuuuchas gracias, ese era el unico problema, ya rula bien, no peta y salta el mensaje que yo he puesto.

Graaaaaaaaaaaaaaaacias.


La franja horaria es GMT +2. Ahora son las 11:25:38.

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