Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ejecutables sin mensajes de excepcion (https://www.clubdelphi.com/foros/showthread.php?t=34420)

sur-se 09-08-2006 12:09:39

Ejecutables sin mensajes de excepcion
 
Hola. Utilizo Delphi 5 y componentes de terceros en mis aplicaciones (SuiPack, Fast Report, etc).
Me gustaría que todos los posibles mensajes de excepción que yo no tenga controlados, en sus respectivos bloques try-except, no aparezcan al usuario por pantalla.
Para ello, incluyo en mi formulario principal un componente "ApplicationEvents" y le escribo el método OnException, que se supone que tomará aquellas excepciones que no han sido manejadas anteriormente, y vuelco el mensaje de excepción a un fichero de log para posteriormente analizarlo.

El problema es que aún así, siguen saliendo mensajes de excepción en pantalla y en inglés, del tipo "Violación de acceso.." etc. Me gustaría que no saliera ninguno, que para eso tengo el manejador global de excepciones. Pero nada, siguen saliendo a veces, provocados por estos componentes añadidos de mi aplicación (fast report, etc).

¿Como puedo hacer para bloquearlos todos? Los mensajes que se muestran al usuario sólo los quiero dar yo.
Salu2.

Enan0 09-08-2006 14:36:08

Yo lo que suelo hacer es. en cada uno de los Funciones o procedimientos que realizo manejo el Try Except, de manera que si el error es lanzado por alguna funcion que se llama desde dicho procedimiento o funcion que de siempre contenido.

Porque muchas veces el error no se genera en la aplicacion principal y si en algun objecto o componente del proyecto.

sur-se 09-08-2006 18:29:06

Aún así, siguen saliendo. Por ejemplo, si la vista previa de fast report da un mensaje de error, aunque ponga el try except el mensaje sale.

ixMike 09-08-2006 19:25:57

Lo más seguro sea que el mensaje se muestre porque en el código de los componentes está así escrito. Quiero decir, que no sean mensajes de excepción, sino que, por ejemplo, deteca algún fallo y lo muestre.

Aquí un ejemplo, para aclarártelo. Tengo un TEdit donde hay que escribir un código de barras (realmente no lo tengo, es para el ejemplo), y claro, en un cod de barras solo hay números, así que no permito que escriban letras, pues en el evento OnKeyPress pongo esto

Código Delphi [-]
 
begin
If not (Key in ['0'..'9'])then
  begin
  Key:=#0;
  ShowMessage('Caracter introducido no válido');
  end;
end;

Si es eso, la única solución es modificar el código fuente de esos componentes :( , o bien usar otros (a ser posible, claro).

jachguate 09-08-2006 19:50:54

Hola sur-se, y hola a todos:

Cita:

Empezado por sur-se
Me gustaría que todos los posibles mensajes de excepción que yo no tenga controlados, en sus respectivos bloques try-except, no aparezcan al usuario por pantalla.
Para ello, incluyo en mi formulario principal un componente "ApplicationEvents" y le escribo el método OnException, que se supone que tomará aquellas excepciones que no han sido manejadas anteriormente, y vuelco el mensaje de excepción a un fichero de log para posteriormente analizarlo.

Comento: he visto mas de una aplicación que hace esto.... y mi criterio es: Si hay un error, mejor que el usuario lo vea (aunque no lo entienda) y no simplemente "Tragarselo".

Cita:

Empezado por sur-se
El problema es que aún así, siguen saliendo mensajes de excepción en pantalla y en inglés, del tipo "Violación de acceso.." etc. Me gustaría que no saliera ninguno, que para eso tengo el manejador global de excepciones. Pero nada, siguen saliendo a veces, provocados por estos componentes añadidos de mi aplicación (fast report, etc).

Hay creadores de componentes que no se han leido la regla de no manejar las excepciones para las que no tienen una solución... y escriben componentes al estilo:

Código Delphi [-]
try
  CualquierCosa;
except
  on E:Exception do
    ShowMessage(E.Message);
end;

Ante estos, lo único que se puede hacer es no usar dichos componentes.

Cita:

Empezado por sur-se
¿Como puedo hacer para bloquearlos todos? Los mensajes que se muestran al usuario sólo los quiero dar yo.
Salu2.

Lo ya dicho. Es increíble que esto ha ocurrido dentro del propio borland... al menos en el caso de los TMaskEdit. Ignoro si ya corrigieron el problema, dado que desde que descubrí que el dichoso componente mostraba errores al usuario, decidí no usarlo nunca mas...

Saludos.

:)

sur-se 10-08-2006 10:22:00

Hola.
No parece que el problema vaya por ahí, pues he revisado los fuentes de los componentes adicionales que uso (eso es lo bueno de comprar componentes con fuentes) y no hay showmessage por ningún sitio. Sólo raise y similares.
Parece que el ApplicationsEvents.OnException no los toma todos.

No quiero dar al usuario mensajes del tipo "Access Violation ... 9f93438.." ni similares que no le sirven para nada. Eso los quiero guardar en un log y luego yo los analizo.
Salu2.

Lepe 10-08-2006 10:30:09

Lo solicitado son los componentes gratuitos LMDTOOLS SE, en su Application.OnException trae un parámetro Cancel para eso mismo.

Otra cosa es que esté de acuerdo con su uso... ;)

Saludos

dec 10-08-2006 12:19:54

Hola,

Cita:

Empezado por Juan Antonio
Hay creadores de componentes que no se han leido la regla de no manejar las excepciones para las que no tienen una solución...

A ver, David, repite conmigo:

No manejar las excepciones para las que no tienes una solución...

Otra vez más:

No manejar las excepciones para las que no tienes una solución...

Otra, otra vez más:

No manejar las excepciones para las que no tienes una solución...

Vale. A ver si se te queda para cuando sea menester. Gracias Juan Antonio. :)

roman 10-08-2006 16:17:45

Yo he leído esto muchas veces desde ayer y todavía no acabo de digerirlo. Supongo que tiene toda la razón pero todavía no me queda claro. En el caso del MaskEdit que menciona sí lo veo claro pues el mentado componente no da oportunidad de interceptar la excepción que provoca la validación de manera que para alterar su comportamiento sólo queda derivar una nueva componente.

Seguire meditándolo :)

// Saludos

jachguate 10-08-2006 21:25:28

Solo por cuirosidad... ¿estas segur@ que no estas viendo los mensajes de excepción dentro del propio IDE?

Esto porque normalmente, mientras estas ejecutando una aplicación desde el IDE, este captura primero las excepciones y te las muestra, a menos que hayas decidido ignorar algunos tipos de excepción o ignorarlas todas en Tools/Debugger Options/Language Exceptions (<= d7) o en Tools/Options/Debugger Options/Borland Debugers/Language Exceptions (>= d2005)

Hasta luego.

;)

sur-se 11-08-2006 09:12:42

Hola. Claro que no. Yo lo utilizo en tiempo de diseño para detectar los errores.
Cuando me refiero a mensajes "no controlados" es en el ejecutable final fuera del Delphi.
En el código de mi programa manejo todas las posibles excepciones con bloques try-except y try-finally según corresponda.
Respecto a ignorar los errores y si salen que el cliente los vea, pues no estoy nada de acuerdo. Prefiero que el cliente, en vez de ver el mensaje "Access Violation 98:4feef94...", vea un mensaje en una pantalla más bonita con botones de notificar la incidencia por email o por fax, etc y un texto del tipo "Se ha producido un error inesperado. Póngase en contacto con bla. ... para notificar la incidencia", o bien loggear el error a un fichero para analizarlo posteriormente. Creo que queda mucho mejor ya que ese mensaje en inglés no aporta nada al cliente.
El problema como digo es que aún teniendo el manejador global ApplicationEvents.OnException, no sé porque consigue salir antes la ventana de errores de windows.
Salu2.


La franja horaria es GMT +2. Ahora son las 16:50:16.

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