Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Exception - mensaje completo (https://www.clubdelphi.com/foros/showthread.php?t=62313)

Galahad 16-12-2008 16:07:36

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 ?,,

Sick boy 17-12-2008 11:09:25

Mi no entender :confused::confused::confused:
Seguro que tu tienes claro el problema, pero yo no he entendido la pregunta

Galahad 17-12-2008 11:21:38

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 :rolleyes:, 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...

defcon1_es 17-12-2008 12:13:00

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;

Sick boy 17-12-2008 12:29:15

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

Galahad 17-12-2008 15:47:57

solucionado de otra manera
 
Cita:

Empezado por Sick boy (Mensaje 331261)
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...

Lepe 17-12-2008 16:30:51

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

Galahad 17-12-2008 21:03:08

Cita:

Empezado por Lepe (Mensaje 331300)
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...

rastafarey 30-12-2008 22:20:35

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.


La franja horaria es GMT +2. Ahora son las 02:15:52.

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