PDA

Ver la Versión Completa : Ayuda con error


JerS
30-11-2007, 19:30:04
Buenas amigos de la comunidad de Delphi, hoy les escribo para solicitarles su gran ayuda, tengo un procedimiento que lleva 5.000 lineas, he revisado mi codigo muchas veces he echo muchas pruebas pero en un momento en especifico se esta abortando mi programa al entrar a este procedimiento pero no he podido detectar el error, se me ha echo imposible porque al estar ejecutandose al reventar el sistema solo me aparece en pantalla el programa se ha tenido un problema y debe cerrarce enviar o no enviar, mi pregunta es la siguiente hay una manera de yo guaradar el error especifico que me esta dando, como el tipo de error, hora y si es posible el numero de la linea de codigo, y en que evento puedo capturar dicho error u excepcion

ContraVeneno
30-11-2007, 19:36:19
Busca información sobre "Try... Except" o sobre "Manejo de Errores"...

o la más complicada de todas. Hay que tener cuidado porque puede salir algo que no deseas.

Primero, abre un navegador de internet, yo use Firefox.
Despues tecleea "google.com" en la barra de direcciones.
Luego en el cuadro donde escribes lo que quieres buscar, escribes "Delphi manejo de errores" o tambien "Delphi manejo de excepciones"
le das click en el botón buscar y verás algunas páginas donde se habla al respecto.

;)

P.D. Perdón si fui un poco sarcástico, pero estoy aburrido :D

Caral
30-11-2007, 19:38:11
Hola
:D
Saludos

Lepe
30-11-2007, 20:53:21
Las excepciones no creo te ayuden en este caso. Es cierto que debes aprender su uso y ponerlas en práctica, pero este error es difícil de encontrar.

Si fuera una excepción, obtendrías un cartelito en pantalla con el mensaje de error, después, quizás el mensaje de windows.

Como no es el caso, lo único que te aconsejo es un archivo .log
Ese procedimiento grande, haz que escriba en el log una secuencia de textos numerados, de forma que el archivo de texto aparezca algo así:

1 - Entrando en el procedimiento tal
2 - Antes de ejecutar entrar en el bucle tal
2.1 - Ciclo del bucle : 1
2.1 - Ciclo del bucle : 2
....

Cuando dé el error de windows, puedes ir a ese log y ver por donde se ha quedado el código. Es muy probable que el error esté mucho atrás y te haga falta añadir más trazas con nombres de variables, valores que tienen, etc, pero es la única forma de atacarlo.

Edito: Lo que quieres de añadir el número de línea donde da el error, sí se puede hacer mira un hilo llamado "debuguear en tiempo de ejecución", aunque ya te digo que en este caso, no te servirá. Sirve cuando el programa da un "" is not a valid integer ... y tu dices ¿y en qué ventana ha salido ese error? ¿en qué procedimiento empiezo a buscar?, aquí si saldrá el error, tipo y línea del código .pas donde ha aparecido el error.


Saludos

Robert01
30-11-2007, 21:03:29
¿Que es lo que hace el programa o que debería hacer? ¿para que sirve?
Deberías ir probando uno a uno los procedimientos y funciones que tienes.

Comprenderás que con la información que proporcionas ni David Copperfield te daría la solución.

saludos

JerS
30-11-2007, 21:14:11
Bueno aunque mi pregunta fue un poco compleja amigo [ContraVeneno] (http://www.clubdelphi.com/foros/member.php?u=6064) yo la formulo por aqui porque se que me van a dar una respuesta mucho mas tecnica y mejor formulada a la que podria obtener en google, por otro lado el manejo de excepciones es muy util pero cuando tu sabes donde esta el error, lo que necesito es ubicar el error en las 5000 lineas de codigo, lo cual seria muy util un archivo log, lo que sucede es que es un modulo de entrada y salida que puede tener cientos de combinaciones y en realidad necesitaria guardar la hora exacta y en donde se esta abortando mi aplicacion , como comenta el amigo Lepe es uno de los errores mas dificil de detectar porque no te dice cual es el error por la pantalla

danilo_candales
30-11-2007, 22:28:00
Pusiste esta pregunta en el foro Varios, y quizás yo sea medio tonto, pero no me queda claro si el procedimiento es un stored procedure de base de datos o un Procedure de Delphi.
Pero no importa. Mi pregunta aplica para cualquiera sea el caso. Si son 5000 líneas porque mejor no lo partes en pedacitos, refactorizas. Y asi puedes controlar mejor la ejecución y vas ejecutando por partes y cuando salte el error tengas una idea mas clara de por donde. Y con ese log es hasta mas fácil cuando el codigo está en pedazos. A cada rutina le asignas un identificador y guardas en el log cada vez que se ejecute hora, usuario, IP, mac adress, no sé, cuantos valores creas puedas necesitar.

Dijo alguien por ahi, divide y vencerás.

Saludos.

Lepe
01-12-2007, 10:37:34
Cuando dices "procedimiento" no lo asocio con un "procedure de delphi", me parecería una auténtica locura, si es así, de verdad te compadezco :D.

Por cada mensaje a grabar en el log se debería:
- abrir el archivo
- escribir la línea de mensaje
- cerrar el archivo.

No uses el jvLog de la JVCL, es una patata.

Si el archivo log se mantiene abierto, al dar el error, se puede perder las últimas escrituras hechas (porque estén en cache).

Guardar la hora es lo de menos, es más.... ¿qué más te dá si el error fue a las 11:00 o a las 14:00? Lo que te interesa es saber qué desencadenó el error. Una de las formas es incluir excepciones dentro de esa rutina, haciéndolas saltar, así puedes identificarlo:

Reglas de oro:
- No dejes nunca un case sin else:

case contador of
0: ....
1: ...
else
raise exception.CreateFmt('oops, "case del contador" no implementado para valor %d',[contador]);

Tampoco dejes un if sin else, si puede existir dicha opción:

type MiPrograma = Class(Exception);
// así diferencias las excepciones de la VCL con las tuyas propias.

if a = 0 then
....
else if a> 0 then
....
else
raise Miprograma.CreateFmt('oops, " a < 0 " no implementado para valor %d',[a]);


Es obvio que ahora mismo, es un engorro hacer todo esto para tí, pero ¡¡deberías seguir buenas prácticas de programación desde un principio!!

Saludos