Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-06-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Question ¿Es posible obtener por código la línea o posición en donde se ha detectado un error?

Buenas a todos los foristas

Tengo una simple duda: ¿Es posible obtener la línea o posición en donde se ha lanzado una excepción, mediante código?

Me explicaré con mayor profundidad: en la Cara Oculta de Delphi 4, hay un ejemplo de como implementar, de forma sencilla, un log de errores... pues... yo lo estuve viendo y me decidí tratar de mejorarlo... sacarle más provecho. Y me he hecho esa pregunta, pues... quisiera llevar en dicho log, no sólo la hora, el tipo de excepción, su mensaje, quien la "disparó", sino también (y muy importante para mí) la línea en donde se detectó.

Todo esto quiero hacerlo con el fin de ir implementando mis propios procesos de testeo, etc... llevar un mejor control de mis errores, y obtener métricas que me permitan determinar rendimientos, etc. En pocas: hacer ingeniería de software (al menos una parte).

Desde ya muchas gracias...
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #2  
Antiguo 15-06-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos

No estoy 100% seguro, pero creo que estos hilos te pueden ayudar. Con la ayuda de Lepe

http://www.clubdelphi.com/foros/showthread.php?t=25840
http://www.clubdelphi.com/foros/showthread.php?t=24363
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 15-06-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Muchas gracias!

Pues lo que me diste es oro para mí... gracias vtdeleon, estoy leyendo a "vuelo" los links que me diste... y hasta el momento... es lo que necesito. Ya lo tengo guardadito para poder continuar leyendo bien tranquilo en otro momento...

Muchas gracias, seguiré investigando en esto...
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 24-06-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
vtdeleon:

La verdad es que de lo que leí, se comenta que se hace con componentes de la JEDI, y no hago uso de esas librerías, ya que hasta el momento no tuve necesidad de usarlas...

Yo cuento por el momento este código:
Código Delphi [-]
unit UErrorLog;
{******************************************************************************
 * UERRORLOG 1.0                                                              *
 ******************************************************************************
 Unidad: UErrorLog
 Versión: 1.0
 Fecha-Hora: 29/04/2006 - 03:33 pm
 Para: Delphi 6
 Autor: Delphius
 ******************************************************************************
 Descripción:
   La unidad UErrorLog permite llevar un registro de todas las excepciones y/o
 errores que se detectaron en una aplicación determinada. Dicho registro tiene
 una estructura como la siguiente:
 hh:mm:ss NombreExcepcion: DescripciónExcepcion

   Para hacer empleo de esta unidad, sólo hay que indicar en que parte del pro-
 grama se desea comenzar a detectar las excepciones mediante el procedimiento
 StartLog(), el cual recibe el directorio completo de donde se desea guardar el
 mismo.

   Esta unidad fue extraída de "La Cara Oculta de Delphi 4", escrita por Ian
 Marteens; ¡Espero que sepas perdonarme Ian! Por lo que se agradece el gesto
 de "querer compartir" tus ejemplos a muchos... por lo menos a mí éste me viene
 al pelo para llevar un control de mi "productividad"  y la calidad de los sis-
 temas que hago.
 ******************************************************************************
 Historial:
   - versión 1.0
 ******************************************************************************}

interface
  {* Procedimientos incorporados *}
  procedure StartLog(const AFileName: string);
  procedure StopLog;

implementation

uses
  SysUtils, Forms;

type
  {* Estructura del log *}
  TExceptionLog = class
    protected
      {** Declaraciones protegidas **}
      SavedHandler: TExceptionEvent;
      FileName: string;
      procedure ExceptionHandler(Sender: TObject; E: Exception);
    public
      {** Declaraciones públicas **}
      constructor Create(const AFileName: string);
      destructor Destroy; override;
  end; {* Fin TExceptionLog *}

var
  Log: TExceptionLog = Nil;

procedure StartLog(const AFileName: string);
{******************************************************************************
 Inicia el log que será guardado en un directorio específico.
 * Parámetro *
   AFileName: Directorio en donde guardar el log
 ******************************************************************************}
begin
  if NOT Assigned(Log)
     then Log := TExceptionLog.Create(AFileName);
end; {* Fin P. StartLog *}

procedure StopLog;
{******************************************************************************
 Detiene la ejecución del log.
 ******************************************************************************}
begin
  if Assigned(Log)
     then begin
            Log.Free;
            Log := Nil;
          end;
end; {* Fin P. StopLog *}

{* ---- TExceptionLog ---- *}
procedure TExceptionLog.ExceptionHandler(Sender: TObject; E: Exception);
{******************************************************************************
 Crea un registro en el log al capturar una excepción y/o error.
 * Parámetro *
 Sender: Objeto que levanta la excepción.
 E: Tipo de excepción levantada
 ******************************************************************************}
var Txt: TextFile;
begin
 Application.ShowException(E);
 try
   AssignFile(Txt,FileName);
   try
     Append(Txt);
   except
     Rewrite(Txt);
   end;
   try
     writeln(Txt, FormatDateTime('hh:nn:ss',Now)+' '+ E.ClassName +': '+E.Message +' - '+Sender.ClassName);
   finally
     CloseFile(Txt);
   end;
 except
 end;
end; {* Fin P. ExceptionLog.ExceptionHandler *}

constructor TExceptionLog.Create(const AFileName: string);
{******************************************************************************
 Crea un objeto de la clase TExceptionLog.
 * Parámetro *
 AFileName: Directorio en donde llevar a cabo el log.
 ******************************************************************************}
begin
  inherited Create;
  FileName := AFileName;
  SavedHandler := Application.OnException;
  Application.OnException := ExceptionHandler;
end; {* Fin C. TExceptionLog-Create *}

destructor TExceptionLog.Destroy;
{******************************************************************************
 Destruye un objeto de la clase TExceptionLog.
 ******************************************************************************}
begin
  Application.OnException := SavedHandler;
  inherited Destroy;
end; {* Fin D. TExceptionLog-Destroy *}

Initialization
  // Nada

Finalization
  // Al finalizar... detener el registro del log
  StopLog;

end.

Como podrás observar, es demasiado simple... estuve viendo que más le puedo sacar al Exception y del Sender... y por el momento no se me ocurre nada...

Realmente me gustaría poder capturar muchas de las cosas que ofrece el componente de la JEDI... pero lo que he leído del hilo que me mandaste, esa info (en parte) va junto al exe,... y no se... me gustaría evitarme eso.

Estaba pensando en descargar la JEDI Library... como para chequear un poco, pero me gustaría saber si hay alguna manera de sacar alguna (por lo menos) de la info que ofrece ese componente... mediante algún código más o menos sencillo sin tener que andar descargandolo. ¿Me explico? A ver, ¿Es posible obtener información parecida a lo que ofrece el componente, sin tener que hacer uso del mismo, por código? No quisiera decargar toda una librería si lo que quiero se puede hacer sin componente... no quiere decir que esté en contra de la librería (estoy seguro de que le sacaría provecho), ¿pero mientras me pueda valer de los componentes estándar (y/o propios)... para que más?

Desde ya muchas gracias.
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 24-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola Delphius,

Cuando planteaste el tema lo primero que hize fue sorprenderme porque Delphi no contara con los "macros" conque cuenta C, como "__FILE__", "__LINE__", etc., etc. Bueno. Unas cosas por otras, imagino.

Me puse a buscar y lo que encontré es lo que habéis vosotros mencionado, es decir, referencias a la librería JCL de la Jedi Library. Ahí me puse un poco a investigar en cuanto me di cuenta de que efectivamente en alguna unidad de esas librerías (las dedicadas al "Debug") se implementaba algo parecido a los macros susomentados.

No conseguí enterarme de mucho, la verdad, pero, lo que trato de decir es que, efectivamente, el código fuente de la JCL está ahí... y parece que consigue lo que necesitas... así que, dándole vueltas... digo yo que encontrarás ahí la manera de quedarte con lo que te haga falta, de entre todo lo que ofrece la JCL para temas de "Debug".

Sí, ya sé, esto ni es respuesta ni es nada. Pero, yo desde luego no sabría cómo plantear el asunto si no es partiendo del código contenido en la JCL, y esto debe ser cuestión de ponerse a ello y tratar comprender al menos las partes del código que puedan interesarnos.

Va. Disculpa tanto rollo para no decir nada que ya no supieras...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 24-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Solo comentar que pertenece a la JCL y no tiene que descargarse la JVCL, son 2 paquetes totalmente distintos:
- JCL --> conjunto de rutinas, clases para llamarlas desde código.
- JVCL --> Componentes a instalar en la Paleta de Delphi.

De hecho, para instalar la JVCL, se necesita primero instalar la JCL por separado .

No puedo asegurarlo al 100 % porque siempre he instalado ambas cosas.

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 24-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Llevas razón Lepe. No sólo no es necesario la JVCL, sino que ni siquiera es preciso la JCL al completo, sino únicamente las unidades que se precise utilizar y las dependencias de estas, claro está.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 25-06-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Thumbs up Muchas gracias...

Pues, gracias Dec y Lepe, por aclarme eso. Al final, instalaré ambas cosas, completas... para no hacerme líos y evitarme posibles dolores de cabeza.

Veré que más me pueden ofrecer estas librerías,... seguro de que son un buen "Migral" para muchos problemas o dificultades, he visto y leído miles de foros que avalan la calidad de dichas herramientas. Así que para algo me van a servir

Muchas gracias,
__________________
Delphius
[Guia de estilo][Buscar]
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
Es posible obtener la MAC de una direccion IP ilichhernandez Internet 3 30-12-2010 11:46:05
Obtener el Contenido de una unidad (cd o hd), es posible? Essato API de Windows 3 22-04-2005 17:10:43
Windows ha detectado un error y debe cerrarse hefesta Conexión con bases de datos 13 26-07-2004 23:51:46
Posición del primer caracter de linea en un RichEdit SCH Varios 0 22-09-2003 20:51:32
Obtener el Codigo de Error En DBexpres lgluna Conexión con bases de datos 0 23-05-2003 17:57:26


La franja horaria es GMT +2. Ahora son las 21:08:27.


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