PDA

Ver la Versión Completa : se pueden desactivar en algún lado los mensajes de error?


cocute
03-02-2010, 11:38:57
pues eso, uso un navegador por pestañas, y es un poco lio revisar todo el código, y me costará un poco saber donde tengo el error,
el caso es que si abro una pestaña y me voy a la primera y la cierro me sale el error:
"list index of bounds (-1)"
El codigo lo tengo preparado para que no ocurra, pero en algunos casos no se porque me sale.

La cosa es, mientras le encuentro una solución adecuada existe algun modo de forzar para evitar que salgan mensajes de error como este "list index of bounds (-1)" aunque se produzcan, ya que el error sale pero al aceptarlo funciona todo correctamente.

gracias

Neftali [Germán.Estévez]
03-02-2010, 13:17:15
Personalmente creo que no es buena idea enmascarar los errores para que no aparezcan, ni te lo recomendaría, porque al final "siempre" trae más problemas.

De todas formas, siempre puedes capturar las excepciones a nivel global (ya hemos hablado antes en los foros del tema), pero como digo no creo que sea una buena práctica ni una buena solución. Revisa el Objeto TApplication y OnException y HandleException de este objeto.

¿No te será más fácil, activar las exceptiones en diseño y ver dónde falla el código?

cocute
03-02-2010, 13:47:21
Muchas gracias, lo he solucionado de este modo, no se si esto se puede simplificar de algún modo sin poner tanto código:


declarando esto primero:
procedure MyExceptionHandler(Sender : TObject; E : Exception );


procedure TForm1.MyExceptionHandler(
Sender : TObject; E : Exception );
var
wRetVal : Word;
begin

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := MyExceptionHandler;

end;


lo que he hecho es coger este ejemplo y dejar el procedimiento MyExceptionHandler en blanco para que no haga nada.
http://www.chami.com/tips/delphi/011497D.html
No se si hay algun modo de hacer lo mismo más simple.
Pero vamos lo importante es que me funciona como esperaba.

Soy consciente de que no es nada recomendable hacer esto, pero en mi caso lo considero una excepción, vamos que se lo que me hago.

delphi.com.ar
03-02-2010, 15:35:17
¿Te parece tanto código?... me sumo a la sugerencia de Neftali, es un error de principiantes pensar que es malo mostrar los mensajes de error, luego nos damos cuenta lo importantes que son para poder depurarlos. Si tienes errores, tienes que preocuparte por solucionarlos, no por taparlos, salvo que estos sean manejados correctamente.

Saludos!

rgstuamigo
03-02-2010, 16:14:10
Muchas gracias, lo he solucionado de este modo, no se si esto se puede simplificar de algún modo sin poner tanto código:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)declarando esto primero: procedure MyExceptionHandler(Sender : TObject; E : Exception ); procedure TForm1.MyExceptionHandler( Sender : TObject; E : Exception ); var wRetVal : Word; begin end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := MyExceptionHandler; end;

lo que he hecho es coger este ejemplo y dejar el procedimiento MyExceptionHandler en blanco para que no haga nada.
http://www.chami.com/tips/delphi/011497D.html
No se si hay algun modo de hacer lo mismo más simple.
Pero vamos lo importante es que me funciona como esperaba.

Soy consciente de que no es nada recomendable hacer esto, pero en mi caso lo considero una excepción, vamos que se lo que me hago.
Bueno :rolleyes: ese código te va funcionar siempre y cuando no hayas capturado alguna excepción dentro de tu código por ejemplo has la prueba a poner dentro del evento Onclick de un boton esto:
procedure TForm1.Button1Click(Sender: TObject);
var a:Integer;
begin
try
a:=StrToInt('Hola 123');//<-linea de código que provocará una Excepcion
except on E: Exception do
ShowMessage('Esta Excepcion no deberia salir pero Sí sale por que la he capturado..');
end;
end;

Se supone que cuando asigno un Procedure(MyExceptionHandler en este caso) al evento OnException del objeto Application tal como lo has hecho, al ocurrir una excepción deberia ejecutarse el mismo, pero como vemos, eso no ocurre si hemos capturado alguna excepcion en alguna parte.;), lo que significa que lo que has hecho no es muy seguro que digamos.;)
Saludos...:)

Neftali [Germán.Estévez]
03-02-2010, 16:15:39
Muchas gracias, lo he solucionado de este modo

Creo que así vamos mal...
Tal vez no has entendido lo que hace ese procedimiento. Una prueba:

(1) Comenta la línea del OnCreate.
(2) Pon dos botones con códigos como estos:
(3) Ejecuta y luego haz lo mismo descomentando la línea.


procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k:Integer;
begin
i := (50DIV 10 - 5);
j := 220;
k := j DIV i; //!!!!!!! DIVISION por CERO
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
raise EAccessViolation.Create('Accessssss Violation!!!!!!')
end;


El problema es que con lo que has hecho DESAPARECEN TODAS las excepciones de tu programa.

Lo lógico (dentro de la poca lógica que tiene esto) sería capturar sólo la excepción que necesitas. Y yo añadiría que ya que la capturas, al menos guardarla en algun sitio (log, txt,...).

No se si me explico.

coso
03-02-2010, 17:58:10
Hola,
el error list index out of bounds te sale debido a que en alguna lista estas intentando acceder a algun elemento que no existe (por encima del count), o bien si es una lista de objetos, a algun objeto que has eliminado de la lista. Lo mejor seria que nos pusieras el codigo para saber por donde te falla. Saludos.

cocute
04-02-2010, 22:41:21
ya dije que solo lo queria para usarlo mientras le encuentro solución, que no creais que es tan facil, no pongo el código ya que es muy largo y un poco lioso de explicar, y dependo no solo de mi código si no del código base y del componente base que he cogido y que tampoco lo controlo totalmente. Es un programa para uso personal y se lo que debe de hacer, si me sale un mensaje de error que me es molesto pero no afecta para nada al funcionamiento del programa, si en principio lo puedo evitar aunque sea de este modo tan chapucero pues eso es lo que hay.

la base del programa es el ejemplo es el
04 - New_Window_Tabs_Demo_2
del componente de Bsalsa EmbeddedWB
pero el ejemplo es muy básico y he añadido tantas cosas.....
el hecho de manejar los tabs y webbrowsers dinámicamente es lo que tiene.

El programa funciona perfectamente con webs normales, el problema es cuando se abren en nuevas pestañas enlaces que estan en javascript y demas cosas que no he probado, entonces es cuando empiezan los problemas que no puedo controlar ya que quizas son cosas del propio componente TEmbeddedWB que no estan muy claras.


¿como debería de hacer para ocultar solo el "List index of bounds (-1)" que me da el pagecontrol y no afecte al resto de excepciones?

cocute
05-02-2010, 11:32:06
al final después de darle vueltas a la cabeza en la cama he localizado y solucionado el error, así que ya no me hace falta esto,
de todos modos seguro que puede venir bien en alguna ocasión que nos encontremos que nuestro programa nos de mensajes de error que no podamos controlar y que no interfieran en el funcionamiento del programa, está claro que anulando el error específico no todos como habia hecho yo.

Lepe
05-02-2010, 13:27:43
La verdad que no sé donde está el "lío".

Para esos tipos de errores suelo activar Tools -> debugger Options -> Language Exception -> Stop on delphi Exception.

Así el IDE se para antes de lanzar la excepción, ves el call stack y miras tus funciones y las variables... seguro que está por ahí, pones puntos de ruptura y listo...así de fácil :rolleyes:

mcs
19-07-2010, 09:12:13
Hola,

Yo creo que si es buena idea usar el capturador general de excepciones. Justamente ahora estaba buscando información sobre este, porqué sabía que tenía que existir, pero no sabía donde.

Mi intención es hacer una ventanica como la de windows cuando falla el programa (Se ha producido la excepción XXXX, quiere enviar un informe de errores? Junto al stack trace, configuración, etc). Creo que para la versión definitiva de un producto es una buena idea, y hasta para cuando se está debugando y el IDE sólo nos avisa de que hay una excepción (pero no donde ni porqué). Bueno, esto de debugando podría ser que tuviese alguna opción desactivada o así, pero siempre me ocurre lo mismo...

Por otra parte, usar un capturador global de excepciones para esconder que el programa tiene errores, en mi opinión es una gran chapuza. Y sobretodo si se puede reproducir el problema facilmente (como era el caso de cocute). Me alegro que haya encontrado el error, y espero que desactive el evento este...

Saludos,

Marc