Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-12-2008
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 18
Galahad Va por buen camino
Exception - mensaje completo

hola, saludos...

estoy utilizando las excepciones, y funciona perfectamente,, (o casi )
, el tema es que cuando pruebo la excepción (No en el entorno de desarrollo), en la ventana de error aparece no el mensaje único de error que yo he asignado a la excepción, sino toda la información de depuración como reflejo a continuación:
Código:
  'datamodule.tabla.insertquery
  exception 
  exception 3
  ERR_NO_TITULO
  El título no puede estar vacio   -> este es el único mensaje que deberia salir
  at trigger 'tabla_bi line 21 col 34'
he probado a quitar de tools+options+debugger options+event log , la opción de 'integrated debugging', pero no funciona. ¿ alguien sabe que puede estar pasando ?,,
Responder Con Cita
  #2  
Antiguo 17-12-2008
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 21
Sick boy Va por buen camino
Mi no entender
Seguro que tu tienes claro el problema, pero yo no he entendido la pregunta
Responder Con Cita
  #3  
Antiguo 17-12-2008
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 18
Galahad Va por buen camino
excepción mensaje

gracias por contestar...
voy a intentar explicarme mejor:
en un trigger before insert, tengo el siguiente código

Código:
   if (new.nombrebanco is null) then exception ERR_NO_TITULO;
En tiempo de ejecución de la aplicación, cuando intento probar la excepción (sin el entorno de debugger de delphi por enmedio), yo espero recibir en la aplicación cliente exclusivamente una ventana con el mensaje
indicado en la excepción 'El titulo no puede estar vacio'.
El problema es que al saltar la excepción, la ventana informativa de dicha excepción muestra toda la información relacionada aquí abajo..

'datamodule.tabla.insertquery
exception
exception 3
ERR_NO_TITULO
El título no puede estar vacio -> este es el único mensaje que deberia salir
at trigger 'tabla_bi line 21 col 34'
claro,,, tanta información , despista mucho al usuario de la aplicación..., no sé si esto tendrá algo que ver con la configuración del servidor....
espero haber estado un poco más atinado con la explicación, gracias y.. saludos...
Responder Con Cita
  #4  
Antiguo 17-12-2008
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Hola.
Yo lo que haría es capturar la excepción desde la aplicación,
con algo parecido a esto:

Código Delphi [-]
uses IB;
...
try
  ...
  insertquery.ExecSQL;
except
on E:Exception do
  ShowMessage('Error/Excepción FireBird: '+IntToStr(EIBInterBaseError(E).IBErrorCode)+#13#10#13#10+E.Message);
end;

Una vez que sepas el codigo de error que devuelve, puedes filtrar el mensaje:
Código Delphi [-]
uses IB;
...
try
  ...
  insertquery.ExecSQL;
except
on E:Exception do
  case EIBInterBaseError(E).IBErrorCode of
  $14000019: ShowMessage('Deadlock');
  $14000888:// se produjo la excepcion ERR_NO_TITULO   
    ShowMessage('El título no puede estar vacio');
end;

Lo ideal es crear un procedimiento o funcion para gestionar todos los mensajes de error de la aplicación, por ejemplo:
Código Delphi [-]
procedure Gestion_de_Errores(E: Exception);
begin
    if E is EIBInterBaseError
    then begin
      case EIBInterBaseError(E).IBErrorCode of
        $14000019: AvisoError('Aviso', 'Coincidencia en el uso del registro.' +#13+
                                       'Otro usuario lo tiene en uso.' +#13+
                                       'Inténtelo de nuevo.    -No es un error-'+#13+
                                       '---------------------------------------'+#13+
                                       'Error/Excepción FireBird: (' + E.Message + ')');
    ....
    ....
      end;
   end;
end;
Para luego usarla asi:
Código Delphi [-]
try
  ...
  insertquery.ExecSQL;
except
  on E:Exception do
    Gestion_de_Errores(E);
end;
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...

Última edición por defcon1_es fecha: 17-12-2008 a las 12:17:51.
Responder Con Cita
  #5  
Antiguo 17-12-2008
Sick boy Sick boy is offline
Miembro
 
Registrado: may 2003
Ubicación: Cantabria
Posts: 245
Poder: 21
Sick boy Va por buen camino
Ok, ahora lo entiendo.

He buscado la forma de construir las excepciones, y parece que puedes hacer algo como:
Código SQL [-]
if (new.nombrebanco is null) then exception ERR_NO_TITULO 'Debe rellenar el titulo';
No se si te dará toda la informacion, pero esta linea "at trigger 'tabla_bi line 21 col 34'" es algo que yo no querria quitar, puesto que te indica donde esta el error.
Para este caso, es obvio, y ya sabes lo que esta mal, pero en otros casos esa info es importante.

Yo por costumbre lo que hago es comprobar los valores antes de hacer el post, y si no cumplen los requisitos, mensaje y para atras. No uso muchos compos dbaware, y cuando los uso no son para edicion, asi que puedo permitirme esto.

defcon1 sugiere capturar los error_code, yo creo que tambien se podrian validar los datos en el evento onBeforeUpdate, y si alguno no cumple se cancela el post y se le envia un mensaje al cliente.

ya nos contaras
Responder Con Cita
  #6  
Antiguo 17-12-2008
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 18
Galahad Va por buen camino
solucionado de otra manera

Cita:
Empezado por Sick boy Ver Mensaje
Ok, ahora lo entiendo.

No se si te dará toda la informacion, pero esta linea "at trigger 'tabla_bi line 21 col 34'" es algo que yo no querria quitar, puesto que te indica donde esta el error.
Para este caso, es obvio, y ya sabes lo que esta mal, pero en otros casos esa info es importante.
el tema es que esa información al usuario no le deberia de aparecer, yo pretendia utilizar la excepción para que el servidor le mandará el mensaje que yo le indico en la excepción 'exclusivamente' y no grabara el registro.
No entiendo porque no puede ser asi... no obstante, lo he resuelto como tu bien dices, desde la parte del cliente, haciendo la prevalidación desde el evento beforepost del componente tfibdataset, pero ya comento, tiene
que haber alguna manera facil de 'formatear' esos mensajes de excepción generados por el usuario.
la opción de defcon1 es muy válida, aunque pienso que no se adapta muy bien a este caso, ya que simplemente queria utilizar la excepción en el servidor como un 'comprobador de campos', quizás lo hubiese podido hacer desde la definición de la columna de la base de datos con la cláusula CHECK...,
gracias a todos,, un saludo...
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
Mensaje de error: Debugger Exception Notification. cesar_gta86 Varios 1 02-07-2008 17:23:57
Path completo en la red RebeccaGL Redes 9 18-02-2008 20:15:18
Listado completo de tabla teclilla Impresión 3 15-02-2008 22:50:58
el codigo completo ElDioni SQL 2 11-07-2005 17:39:41
Informe Completo Franklim Impresión 5 02-04-2004 13:45:29


La franja horaria es GMT +2. Ahora son las 12:09:39.


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