Как я могу узнать, какая процедура выбрала исключение в Delphi?
Я использую 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;
Ответы
Ответ 1
Вы можете получить адрес памяти, в котором было выбрано исключение, с помощью переменной ExceptAddr (системный блок). Но если вам нужна трассировка стека, вы можете использовать один из инструментов 3rdParty MadExcept, EurekaLog или открытый JCLDebug (часть JCL) с открытым исходным кодом.
Ответ 2
Самый простой и быстрый способ - использовать JCL исключение и отладочную поддержку. После установки JCL не забудьте вставить символы отладки в двоичный файл (Projects → JCL debug expert → Insert JDBG data для этого двоичного файла → Включено) и добавить в проект окно исключения 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=
Ответ 3
В основном связано: Обработка исключений в Delphi.