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
  #7  
Antiguo 17-12-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Puedes usar la opción de defcon1 perfectamente.... pero en lugar de usarlo en un try... except, coloca ese código del except en un ApplicationsEvents.OnException.

Así la misma rutina de gestión de excepciones la tienes centralizada en un único sitio y te vale para todos los errores de la aplicación.

Si no quieres que muestre todo el mensaje cárgate el mensaje original de la excepción y pones el tuyo.... a ver si me explico con código:
en el applications.OnException
Código Delphi [-]
var 
  personal, original:string;
// E:Exception viene definida en los parámetros de este evento.
 personal := EmptyStr;
 if E is EIBInterbaseError then
 begin
  case EIBInterBaseError(E).IBErrorCode of
  $14000019: personal := 'Deadlock producido, pepe';
  $14000888: personal := 'El título no puede estar vacio';
  end;

  MiLog.Add(E.Message); // grabar mensaje original
  E.Message := personal;
  Application.ShowException(E);
end;
Application.ShowException no estoy muy seguro, creo que es la forma correcta, pero no recuerdo si pertenece a "Application" o es una rutina escondida...

También puedes usar en Interbase un prefijo para todas tus excepciones, por ejemplo al definir la excepción lo haces así:
Código SQL [-]
exception "Mi_excepcionIBInicio El usuario no puede estar en blanco  Mi_excepcionIBFin"
exception "Mi_excepcionIBInicio El código debe ser mayor que cero Mi_excepcionIBFin"
Ahora en el applications.OnException buscas la cadena prefijo "Mi_excepcionIBInicio" y sólo copias el texto hasta el sufijo "Mi_excepcionIBFin"

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 17-12-2008 a las 16:35:26.
Responder Con Cita
  #8  
Antiguo 17-12-2008
Galahad Galahad is offline
Miembro
 
Registrado: abr 2007
Posts: 218
Poder: 18
Galahad Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
Puedes usar la opción de defcon1 perfectamente.... pero en lugar de usarlo en un try... except, coloca ese código del except en un ApplicationsEvents.OnException.

Así la misma rutina de gestión de excepciones la tienes centralizada en un único sitio y te vale para todos los errores de la aplicación.

ok, gracias, creo que ahora si que lo tengo claro, me pongo a la faena de crear un manejador de errores,,, universal...
gracias a todos...
Responder Con Cita
  #9  
Antiguo 30-12-2008
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
resp

El problema no es del manejador si no de los componentes que estes usando. Lo que hacer es sobreescribir el codigo del componente donde se lansa la exception. Y es si los componentes no dispones de las fuentes podrian crean on procedimiento onexception global ya asignarselo a al aplicacion y hay verificas si le exception es del tipo d einterbase o firebird y arreglas la caeena a tu conveniencia.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
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 18:24:48.


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