Ответ 1
TDataModule
1 имеет специальную обработку исключений, выраженных в событии OnCreate
.
Исключение обрабатывается здесь:
procedure TDataModule.DoCreate;
begin
if Assigned(FOnCreate) then
try
FOnCreate(Self);
except
if not HandleCreateException then // <-- here
raise;
end;
end;
function TDataModule.HandleCreateException: Boolean;
begin
if Assigned(ApplicationHandleException) then
begin
ApplicationHandleException(Self); // <-- here
Result := True;
end
else
Result := False;
end;
По умолчанию TApplication
присваивает TApplication.HandleException()
ApplicationHandleException
:
constructor TApplication.Create(AOwner: TComponent);
var
...
begin
inherited Create(AOwner);
...
if not Assigned(System.Classes.ApplicationHandleException) then
System.Classes.ApplicationHandleException := HandleException; // <-- here
if not Assigned(System.Classes.ApplicationShowException) then
System.Classes.ApplicationShowException := ShowException;
...
end;
Итак, TDataModule.DoCreate()
перехватывает исключение и передает его на TApplication.HandleException()
, который затем отображает всплывающее диалоговое окно по умолчанию. И так как TDataModule.HandleCreateException()
затем возвращает True, исключенное исключение не будет повторно поднято. Исключение теперь считается обработанным, что позволяет программе нормально продолжать свой вызов Showmessage('DM started!');
.
Чтобы избежать всплывающего диалогового окна при возникновении исключения, вы можете назначить обработчик события TApplication.OnException
:
Vcl.Forms.TApplication.OnException
Использовать OnException для изменения поведения по умолчанию, которое происходит, когда исключение не обрабатывается кодом приложения. Событие OnException обработчик вызывается автоматически в методе HandleException.
Но исключение все равно будет уловлено и отклонено TDataModule.DoCreate()
. Если вы хотите этого избежать, поэтому исключение распространяется на стек вызовов, не поднимайте исключение из события TDataModule.OnCreate
вообще. Переопределите виртуальный конструктор TDataModule.Create()
и вместо этого создайте исключение.
1: То же самое происходит и в TCustomForm
.