Uprzejmie proszę o poradę dotyczącą następującego problemu, który napotkałem w Delphi z blokiem try/except
.Jak wychwycić wyjątek w zdarzeniu TDataModule.OnCreate?
Mam prostą aplikację - jeden MainForm o nazwie fr_MAIN
i jeden TDataModule
o nazwie DM
. DM
nie jest automatycznie tworzone, ale jest on tworzony w czasie wykonywania w fr_MAIN
„s Button2.OnClick
imprezy:
procedure Tfr_MAIN.Button2Click(Sender: TObject);
begin
try
DM := TDM.Create(nil);
Showmessage('DM started!');
except
on E:Exception do
begin
Showmessage('DM not started!');
end;
end;
DM
ma jakiś kod w swoim OnCreate
zdarzenia:
procedure TDM.DataModuleCreate(Sender: TObject);
begin
raise Exception.Create('this is error!');
// DM code here ...
end;
Problem polega na tym, że kiedy Klikam na Button2
, otrzymuję komunikat wyjątku 'this is error!'
, reszta DM code here
nie działa - co jest poprawne! Ale potem również pojawia się komunikat 'DM started!'
zamiast komunikatu 'DM not started!'
.
Wyjątek zgłoszony przez DM
przerywa akcję, ale nie jest przechwytywany w bloku formularza except
!
Dlaczego tak jest?
Domyślnie 'TApplication' mówi' TDataModule' aby połknąć wyjątek wywołany przez zdarzenie 'TDataModule.OnCreate' (zobacz odpowiedź Toma na konkretne szczegóły). Aby wykonać to, o co prosisz, powinieneś zastąpić wirtualny konstruktor 'TDataModule.Create()', aby podnieść wyjątek zamiast używać zdarzenia 'TDataModule.OnCreate'. –