Historial de actualizaciones: No.2
Hora de actualización: 2001-10-21 02:42
Actualizado por: Musicwind®
Nota de actualización: formato modificado.
Historial de actualizaciones: No.1
Hora de actualización: 2001-10-19 21:15
Actualizado por: Musicwind®
Notas de actualización: Creado.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
Prefacio: He estado inmerso en Delphi durante más de tres años, pero cada vez que leo la documentación de ayuda de Delphi, sigo ganando mucho, así que no puedo evitar suspirar por lo amplio que es Delphi. Aunque me siento avergonzado, analizaré algunas de mis experiencias y logros y compartiré mi aliento con aquellos de ustedes que son tan arrogantes y menos informados como yo.
1. ¿Qué es una excepción silenciosa? (¿Por qué no El silencio de los corderos? ;- ))
Las excepciones silenciosas, es decir, Slient Exceptions , se refieren al tipo de excepción que no provoca mensajes molestos de forma predeterminada: EAbort . En Object Pascal, la clase de excepción EAbort es la clase ancestral de todas las clases de excepción silenciosas (y EAbort hereda Exception). Generar un EAbort hará que un módulo de ejecución se detenga hasta que el módulo de manejo de excepciones más externo lo intercepte, pero no provocará que aparezca un cuadro de mensaje con una señal de alto roja. Consulte el siguiente código:
intentar
MostrarMensaje('Hola1');
Levante EAbort.Create('Abortar');
MostrarMensaje('Hola2');
excepto
en E: Excepción
showmessage('En caso de excepción');
fin;
El resultado de la ejecución muestra dos cuadros de mensaje, uno es "Hola1" y el otro es "En excepción". Esto muestra que EAbort funciona porque omite la instrucción "ShowMessage('Hello2')" y al mismo tiempo no aparece el cuadro de mensaje "Abortar", lo que también confirma la característica de la clase de excepción EAbort de que no hay diálogo; (Esto también es cierto durante el diseño) y el cuadro de mensaje "En excepción" indica que aunque EAbort puede ser una anomalía diferente de las excepciones ordinarias, esto no nos impide utilizar la antigua declaración Try-Except para detectarla. .
2. ¿Por qué utilizar EAbort ?
EAbort es útil en determinadas situaciones. Por ejemplo, cuando necesitamos finalizar una operación pero no queremos que los usuarios lo noten (no queremos que vean el cuadro de mensaje de excepción predeterminado). Por supuesto, para lograr el mismo efecto, también puede usar excepciones ordinarias (por ejemplo, usar el patrón de oración Try-Except, colocar el código en la sección Try, generar una excepción si necesita finalizar la operación y no escribir cualquier código en la sección Excepto), pero nada de esto es tan simple y directo como usar EAbort.
3. ¿Hay algo más sencillo? --Usando el proceso de Abortar
Abortar, un proceso definido en la unidad SysUtils, nos permite utilizar EAbort cómodamente. Ver el código fuente de implementación de Abortar:
Aborto del Procedimiento;
función ReturnAddr: puntero;
ENSAMBLE
MOV EAX,[EBP + 4]
fin;
comenzar
aumentar EAbort.Create(SOperationAborted) en ReturnAddr;
fin;
SOperationAborted aquí suele ser "Operación abortada".
4. Levantar el velo: principio de implementación
Quizás usted, como yo, tenga curiosidad por saber por qué EAbort guarda silencio. ¿Qué le ha hecho Delphi a EAbort internamente? Averigüemos juntos.
Abra un nuevo proyecto, haga clic en Buscar en archivos, ingrese la palabra clave "EAbort", luego seleccione el botón de opción Buscar en directorios y configure el cuadro de edición Máscara de archivo en Opciones de directorio de búsqueda con el nombre del directorio donde se encuentra el código fuente de Delphi (como como el mío Sí: D: Archivos de programa BorlandDelphi6Source), y no olvide marcar Incluir subdirectorio. Finalmente, haga clic en "Aceptar" para iniciar la búsqueda.
Como resultado, encontramos que hay hasta 17 lugares en el código fuente de Delphi que están relacionados con EAbort. Excepto por las dos declaraciones de EAbort y algunas declaraciones de comentarios en la unidad Sysutils, encontramos que la mayor parte del código es similar a:
si ExceptObject es EAbort entonces
así como también:
si no (E es EAbort) entonces
etc.
Todos ellos tienen un tratamiento especial para EAbort basado en RTTI : ¡resulta que la implementación de EAbort es así de simple!
Las dos unidades que merecen atención son: Forms (la versión de Linux es QForms) y AppEvnts. Es más fácil encontrar la respuesta a la pregunta en el código del primero. Ver el código fuente de Delphi:
procedimiento Tapplication.HandleException (Remitente: TObject);
comenzar
si GetCapture <> 0 entonces SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
si ExceptObject es una excepción, entonces
comenzar
si no (ExceptObject es EAbort), entonces
si está asignado (FOnException), entonces
FOnException(Remitente, Excepción(ExceptObjeto))
demás
ShowException(Excepción(ExceptObjeto));
fin de otra manera
SysUtils.ShowException(ExceptObject, ExceptAddr);
fin;
5. La diferencia entre Abortar , Romper y Salir
Abortar, Interrumpir y Salir son algo similares, pero muy diferentes. Break se utiliza para salir de un bucle en una declaración de bucle. Salir se utiliza para saltar del cuerpo de la función que se está ejecutando actualmente (o del cuerpo del proceso). Abortar le permite saltar de una o más capas de código hasta que el código de detección de excepciones lo detecte.
6. Personaliza las excepciones silenciosas
Al igual que declarar una subclase de una clase de excepción normal, simplemente convierta EAbort y sus subclases en clases antecesoras:
TMyException = Clase(EAbort);
TNextException = Clase(EAbort);
etc.
Musicwind®@HangZhou.Zhejiang.China
2001-10-20
Más artículos
[ Fin del artículo]