TDataModule
1 has special handling of exceptions raised in its OnCreate
event.
异常处理在这里:
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()
to 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;
So, TDataModule.DoCreate()
正在捕获异常并将其传递给TApplication.HandleException()
,然后默认显示一个弹出对话框。自从TDataModule.HandleCreateException()
然后返回 True,捕获的异常不会重新引发。该异常现在被视为已处理,允许程序正常继续执行其任务Showmessage('DM started!');
call.
为了避免在引发异常时弹出对话框,您可以分配一个TApplication.OnException
事件处理程序:
Vcl.Forms.TApplication.OnException
使用 OnException 更改发生异常时发生的默认行为
应用程序代码不处理异常。 OnException 事件
handler 在 HandleException 方法中自动调用。
但异常仍然会被捕获并被驳回TDataModule.DoCreate()
。如果您想避免这种情况,以便异常在调用堆栈中向上传播,请不要从TDataModule.OnCreate
事件根本。覆盖虚拟TDataModule.Create()
构造函数并从那里引发异常。
1: The same thing also happens in TCustomForm
.