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 12-08-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
excepciones con raise at

Buenas, gente.

Ayer estaba revisando la gramática de Pascal que viene en Delphi 7, y me encontré con una regla que decía

NoMeAcuerdo -> RAISE [Object] AT [Address]

Que ahora que me fijo no está en Delphi 5...

Y me agarró la inquietud, ¿Alguien sabe qué se hace con ese "AT"? Porque lo de "raise" lo conozco, pero el AT, ni idea, y no encunetro nada en la red...

Gracias miles.

Última edición por Lord Delfos fecha: 12-08-2008 a las 15:04:57.
Responder Con Cita
  #2  
Antiguo 12-08-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Hasta hoy me entero de la palabra reservada At. Es interesante lo que dice la ayuda al respecto:
Cita:
Use this option to raise the exception from an earlier point in the stack than the one where the error actually occurred.
[Utilice esta opción para elevar la excepción desde un punto previo en la pila que desde donde ocurrió realmente el error.]

Todavía no lo tengo claro del todo, pero, al buscar la expresión regular "Raise .* At " en la carpeta C:\Archivos de programa\Borland\Delphi7\Source, encontré que Borland lo utilizó en varias ocasiones.

Al ver el código fuente del famoso procedimiento Abort en la unidad SysUtils:
Código Delphi [-]
procedure Abort;

  function ReturnAddr: Pointer;
  asm
          MOV     EAX,[EBP + 4]
  end;

begin
  raise EAbort.CreateRes(@SOperationAborted) at ReturnAddr;
end;
Se observa que la excepción es elevada en la dirección de memoria devuelta por la función anidada ReturnAddr. Esta función le asigna al registro de la CPU EAX el valor que se encuentra en la dirección de memoria EBP + 4. Y ese es el valor que devuelve, ya que normalmente una función regresa el valor que se encuentra en el registro EAX. Ahora sólo habría que investigar qué suele guardar el registro de CPU EBP en Delphi para tener una idea más precisa de qué dirección en concreto se está usando para elevar la excepción.

Mientras tanto infiero que al ejecutar el procedimiento Abort de esta manera:
Código Delphi [-]
Procedure MiRutina;
Begin
  ...
  Abort;
la excepción se elevará en la dirección de memoria donde hemos hecho la llamada a Abort y no donde Abort ejecuta la instrucción Raise. Lo cual, para fines de depuración es muy conveniente, ya que el depurador nos dirá que se elevó una excepción formalmente dentro de MiRutina y no dentro del procedimiento Abort. Abort es un procedimiento utilitario para simplificar la elevación de una excepción silenciosa, pero la manera en que hace dicha elevación (con At), ayuda a que suceda como si en lugar de Abort hubiésemos escrito nosotros mismos una instrucción Raise, según parece.

Encontré este interesante artículo relacionado con el tema:
http://www.latiumsoftware.com/es/pascal/0014.php

Y este par de referencias adicionales que hablan del registro EBP:
http://akimpech.izt.uam.mx/Web_jr/ami05/convC.pdf
http://www.hackemate.com.ar/ezines/d...nts004/0X1.txt

Espero haber ayudado.

Al.

Última edición por Al González fecha: 12-08-2008 a las 16:38:30.
Responder Con Cita
  #3  
Antiguo 12-08-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
¡Ajá! Tu búsqueda fue mucho más frutífera que la mía...

Habrá que investigar el asunto.

Graciocles, Al.
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
Para qué usar raise Exception wascar2003 Varios 3 20-11-2007 12:50:15
Excepciones adpa OOP 5 14-12-2005 15:45:45
Excepciones Acker Tablas planas 6 06-08-2005 15:22:18
excepciones!!!!! hanna33 OOP 3 24-05-2005 17:10:10
Excepciones del bde Pablo Carlos Conexión con bases de datos 3 15-04-2005 17:57:46


La franja horaria es GMT +2. Ahora son las 11:31:03.


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