Как я могу узнать, какая процедура вызвала исключение в Delphi? - PullRequest
11 голосов
/ 07 декабря 2008

Я использую событие Delphi TApplication.OnException для перехвата необработанных исключений

Это работает хорошо, но не дает достаточной информации о том, где произошло исключение т.е. "Катастрофический сбой"

Как узнать, в какой процедуре произошла ошибка?

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;

Ответы [ 3 ]

23 голосов
/ 07 декабря 2008

Вы можете получить адрес памяти, на который было сгенерировано исключение, используя переменную ExceptAddr (системный блок). Но если вам нужна трассировка стека, вы можете использовать один из инструментов 3rdParty MadExcept, EurekaLog или JCLDebug с открытым исходным кодом (часть JCL).

8 голосов
/ 07 декабря 2008

Самый простой и быстрый способ - использовать исключение JCL и поддержку отладки. После установки JCL обязательно вставьте символы отладки в двоичный файл (Проекты -> Эксперт по отладке JCL -> Вставить данные JDBG для этого двоичного файла -> Включен) и добавьте диалоговое окно исключений JCL в проект (Файл -> Новый .. . -> Диалоги -> Диалог исключений).

Если установщик JCL не может добавить это диалоговое окно в хранилище объектов и он не появляется (это случилось со мной несколько раз), либо добавьте его вручную, скопировав файлы .pas и .dpr из jcl-install-dir\experts\debug\dialog в свой спроецируйте и добавьте их вручную или закройте Delphi, отредактируйте %DELHPIDIR%\bin\delphi32.dro в текстовом редакторе и добавьте в него что-то подобное (корректируя пути, конечно:)

[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=
6 голосов
/ 07 декабря 2008

В основном связанные: Обработка исключений в Delphi .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...