try manejo excepciones catch delphi exception-handling

manejo - ¿Cómo puedo averiguar qué procedimiento arrojó una excepción en Delphi?



manejo de excepciones en delphi (3)

Estoy usando Delphi TApplication.OnException Event para capturar excepciones no controladas

Esto funciona bien pero no proporciona información suficiente sobre dónde ocurrió la excepción, es decir, "falla catastrófica".

¿Cómo puedo averiguar qué procedimiento hizo que ocurriera el error?

procedure TFrmMain.FormCreate(Sender: TObject); begin Application.OnException := MyExceptionHandler; end; procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception ); begin LogException (E.Message); Application.ShowException( E ); end;


La forma más sencilla y rápida sería usar la excepción JCL y el soporte de depuración. Después de instalar el JCL, asegúrese de insertar los símbolos de depuración en el binario (Proyectos -> Experto en depuración JCL -> Insertar datos JDBG para este binario -> Habilitado) y agregue un cuadro de diálogo de excepción JCL al proyecto (Archivo -> Nuevo ... . -> Diálogos -> diálogo de excepción).

Si el instalador de JCL no agrega ese diálogo al repositorio de objetos y no aparece (me pasó algunas veces), agréguelo manualmente copiando el archivo .pas y .dpr desde jcl-install-dir/experts/debug/dialog en su proyecto y agregarlos manualmente, o cerrar Delphi, editar %DELHPIDIR%/bin/delphi32.dro en un editor de texto y agregarle algo como esto (ajustando las rutas del curso :)

[P:/DELPHI11/EXTERNALLIB/JCL/EXPERTS/DEBUG/DIALOG/EXCEPTDLG] Type=FormTemplate Name=Exception Dialog Page=Dialogs Icon=P:/DELPHI11/EXTERNALLIB/JCL/EXPERTS/DEBUG/DIALOG/EXCEPTDLG.ICO Description=JCL Application exception dialog Author=Project JEDI DefaultMainForm=0 DefaultNewForm=0 Ancestor= [P:/DELPHI11/EXTERNALLIB/JCL/EXPERTS/DEBUG/DIALOG/EXCEPTDLGMAIL] Type=FormTemplate Name=Exception Dialog with Send Page=Dialogs Icon=P:/DELPHI11/EXTERNALLIB/JCL/EXPERTS/DEBUG/DIALOG/EXCEPTDLGMAIL.ICO Description=JCL Application exception dialog Author=Project JEDI DefaultMainForm=0 DefaultNewForm=0 Ancestor=


Puede obtener la dirección de memoria donde se lanzó la excepción utilizando la variable ExceptAddr (unidad del sistema). Pero si quiere un seguimiento de la pila, puede usar una de las herramientas de 3rdParty, MadExcept, EurekaLog o JCLDebug de código abierto (parte del JCL).