2008-12-07 5 views
11

używam Delphi TApplication.OnException zdarzenie do połowu nieobsługiwany wyjątekJak mogę się dowiedzieć, która procedura spowodowała wyjątek w Delphi?

Działa to dobrze, ale nie daje wystarczających informacji o którym wyjątek stało IE poważnej awarii "

Jak mogę dowiedzieć się, co sprawiło, procedura błąd się wydarzył?

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; 

Odpowiedz

23

można uzyskać adres pamięci, gdzie wyjątek za pomocą zmienna ExceptAddr (jednostka systemowa). Ale jeśli chcesz śledzić stos, możesz użyć jednego z narzędzi ThirdParty MadExcept, EurekaLog lub JCLDebug (część JCL).

+0

Witaj, Andy - witamy w SO ...! – Roddy

+0

Dzięki - Właśnie otrzymałem Eurekalog - działa dobrze –

8

Najprostszym i najszybszym sposobem byłoby wykorzystanie wsparcia JCL wyjątku i debugowania. Po zainstalowaniu JCL, umieść symbole debugowania w binarnym (Projekty -> Ekspert debugowania JCL -> Wstaw dane JDBG dla tego pliku binarnego -> Włączone) i dodaj do projektu okno dialogowe wyjątku JCL (Plik -> Nowy .. -> Dialogi -> Okno dialogowe Wyjątek).

Jeśli instalator JCL nie doda tego okna dialogowego do repozytorium obiektów i nie pojawi się (zdarzyło się to kilka razy), dodaj go ręcznie, kopiując plik .pas i .dpr z jcl-install-dir\experts\debug\dialog do swojego projektu i dodając je ręcznie lub w pobliżu Delphi, edytować %DELHPIDIR%\bin\delphi32.dro w edytorze tekstu i dodać coś takiego do niego (dostosowanie ścieżki oczywiście :)

 
[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=